多处理队列:pygame 表面死亡
Multiprocessing queue: pygame surface died
我想使用多处理来分离 pygame 中的两个任务:从网络摄像头中提取图像并在屏幕上显示图像。我之所以要这样做,是因为
- 我想要花哨的图像处理
- 我想将网络摄像头轮询与屏幕和用户输入分开
并希望将两者的时间延迟分开,理想情况下优化负载。使用线程我可以毫无问题地将图像从一个线程发送到另一个线程。但是,我得到一个滞后的图像。我想测试使用多处理是否可以减少图像的延迟。
问题是:将图像从相机进程发送到屏幕进程后出现错误。使用
从队列中拉出图像后
imgmsg = img_q.get()
我用
检查图像的尺寸
imgmsg.img.get_width()
如前所述,使用线程这个 returns 正确的图像宽度。但是使用多处理我得到以下错误
Process Process-1: Traceback (most recent call last): File "/usr/lib/python3.2/multiprocessing/process.py", line 267, in
_bootstrap
self.run() File "/usr/lib/python3.2/multiprocessing/process.py", line 116, in run
self._target(*self._args, **self._kwargs) File "test_photoBoothMultiProc.py", line 21, in consumer
photoBoothScreen.screenThread(in_q, img_q) File "/home/pi/pyBooth/thread_photoBoothScreen.py", line 68, in screenThread
print(imgmsg.img.get_width()) pygame.error: display Surface quit
看来图像在队列中丢失了?我试过阅读这个,并且在翻译时似乎有问题
通过队列 mitting 较大的对象。这个对吗?我该如何规避或解决这个问题?
在发送到另一个进程之前先序列化图像(使用 pygame.image.tostring
/pygame.image.fromstring
)。
应该可以。这样,您只发送图像本身的数据,而不是 Surface
实例(因此它完全独立于 pygame)。
请注意,您还可以进一步压缩字符串,只需对该字符串调用 .encode("zlib")
/.decode("zlib")
。
我想使用多处理来分离 pygame 中的两个任务:从网络摄像头中提取图像并在屏幕上显示图像。我之所以要这样做,是因为
- 我想要花哨的图像处理
- 我想将网络摄像头轮询与屏幕和用户输入分开
并希望将两者的时间延迟分开,理想情况下优化负载。使用线程我可以毫无问题地将图像从一个线程发送到另一个线程。但是,我得到一个滞后的图像。我想测试使用多处理是否可以减少图像的延迟。
问题是:将图像从相机进程发送到屏幕进程后出现错误。使用
从队列中拉出图像后imgmsg = img_q.get()
我用
检查图像的尺寸imgmsg.img.get_width()
如前所述,使用线程这个 returns 正确的图像宽度。但是使用多处理我得到以下错误
Process Process-1: Traceback (most recent call last): File "/usr/lib/python3.2/multiprocessing/process.py", line 267, in
_bootstrap
self.run() File "/usr/lib/python3.2/multiprocessing/process.py", line 116, in run
self._target(*self._args, **self._kwargs) File "test_photoBoothMultiProc.py", line 21, in consumer
photoBoothScreen.screenThread(in_q, img_q) File "/home/pi/pyBooth/thread_photoBoothScreen.py", line 68, in screenThread
print(imgmsg.img.get_width()) pygame.error: display Surface quit
看来图像在队列中丢失了?我试过阅读这个,并且在翻译时似乎有问题 通过队列 mitting 较大的对象。这个对吗?我该如何规避或解决这个问题?
在发送到另一个进程之前先序列化图像(使用 pygame.image.tostring
/pygame.image.fromstring
)。
应该可以。这样,您只发送图像本身的数据,而不是 Surface
实例(因此它完全独立于 pygame)。
请注意,您还可以进一步压缩字符串,只需对该字符串调用 .encode("zlib")
/.decode("zlib")
。