Pygame与Multiprocessing混合的奇怪行为

时间:2017-08-06 12:08:36

标签: python pygame multiprocessing

我正在开发一个包括Raspberry Pi相机在内的小项目。我在PC上使用多处理来执行各种任务,其中一个是在Pygame窗口中显示图像。我有经理来尽量减少遇到问题的代码。这是主要功能,它只创建一个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的退出按钮时结束。但是,如果我从pygame.quit()的{​​{1}}方法中注释掉Game行,则会向我显示以下消息:

run

我尝试使用谷歌搜索该错误但收效甚微。我无法摆脱我尝试不应该做的事情的感觉,考虑到Pygame的窗口可能是一个独立的过程。

我很感激有关如何阅读的见解和建议

1 个答案:

答案 0 :(得分:0)

正如Blckknght建议的那样,问题是父进程(main.py)启动了PyGame的窗口,而子进程(game.py)尝试quit它。可以通过移动这部分来解决它:

    pygame.init()
    self.screen = pygame.display.set_mode((100, 100))

进入Game' run方法