【问题标题】:Bizarre behaviour of Pygame mixed with MultiprocessingPygame 与多处理混合的奇怪行为
【发布时间】: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 的退出按钮时结束。但是,如果我从Gamerun 方法中注释掉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.initpygame.display.set_mode 调用移动到run 的顶部,看看是否可行。
  • 我似乎记得 pygame 根本无法处理多处理或线程。
  • @Blckknght 这似乎已经解决了这个问题
  • 请在答案中回答,不要在 cmets 中回答

标签: python pygame multiprocessing


【解决方案1】:

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

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

进入Gamerun方法

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-25
    • 2014-10-09
    • 1970-01-01
    • 2014-10-12
    • 1970-01-01
    相关资源
    最近更新 更多