2
我正在研究一個包括Raspberry Pi相機在內的小項目。我正在PC上使用多處理來執行各種任務,其中一個正在Pygame窗口中顯示圖像。我有經理來最小化遭受問題的代碼。這是主要的功能,剛剛創建Game
過程中,運行它,並等待其結束:Pygame與多處理混合的奇怪行爲
# 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'的頂部,看看是否有效。 – Blckknght
我似乎想起pygame根本無法處理多處理或線程。 – oxrock
@Blckknght這似乎已經解決了這個問題 – Jytug