【发布时间】:2017-08-06 12:08:35
【问题描述】:
我正在做一个小项目,包括 Raspberry Pi 相机。我在 PC 上使用多处理来执行各种任务,其中之一是在 Pygame 窗口中显示图像。我有经理来尽量减少遇到问题的代码。这是 main 函数,它只是创建一个Game 进程,运行它并等待它结束:
# main.py
from multiprocessing import Manager
import game
with Manager() as manager:
namespace = manager.Namespace()
namespace.done = False
jobs = [
game.Game(namespace),
]
for job in jobs:
job.start()
for job in jobs:
job.join()
下面是Game 类的代码。状态是共享的,因为会有其他进程检查程序是否完成。
# game.py
import multiprocessing
import pygame
import time
import sys
class Game(multiprocessing.Process):
def __init__(self, the_state):
super(Game, self).__init__()
pygame.init()
self.screen = pygame.display.set_mode((100, 100))
self.state = the_state
def handle_key_events(self):
""" Wrapper for handling key events """
for event in pygame.event.get():
if event.type == pygame.QUIT:
self.state.done = True
return
def run(self):
while True:
self.handle_key_events()
if self.state.done:
print('exiting PyGame thread')
pygame.display.quit()
pygame.quit()
return
现在的行为是它不会在单击 Pygame 的退出按钮时结束。但是,如果我从Game 的run 方法中注释掉pygame.quit() 行,它会给我以下消息:
exiting PyGame thread
XIO: fatal IO error 11 (Resource temporarily unavailable) on X server ":0"
after 120 requests (120 known processed) with 1 events remaining.
我尝试用谷歌搜索该错误,但收效甚微。考虑到 Pygame 的窗口可能是一个独立的过程,我无法摆脱我在尝试一些不应该做的事情的感觉。
我会很感激一些关于在哪里阅读的见解和建议
【问题讨论】:
-
我从未尝试过你在做什么,但我猜这个问题与
pygame.init的调用位置有关。我认为它将在构造Game实例时在主进程中调用,而不是在子进程中调用(仅在调用start()时才会启动)。尝试将pygame.init和pygame.display.set_mode调用移动到run的顶部,看看是否可行。 -
我似乎记得 pygame 根本无法处理多处理或线程。
-
@Blckknght 这似乎已经解决了这个问题
-
请在答案中回答,不要在 cmets 中回答
标签: python pygame multiprocessing