Je travaille sur un petit projet incluant la caméra Raspberry Pi. J'utilise le multitraitement sur le PC pour effectuer diverses tâches et l'une d'entre elles affiche des images dans une fenêtre Pygame. J'ai un gestionnaire pour minimiser le code souffrant du problème. Ceci est la fonction principale, ce qui crée juste un processus Game
, court et attend à la fin:Comportement bizarre de Pygame mélangé avec Multiprocessing
# 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()
est sous le code de la classe Game
. L'état est partagé car d'autres processus vérifient si le programme est terminé.
# 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
Le comportement est maintenant qu'il ne se termine pas en cliquant sur le bouton de sortie de Pygame. Cependant, si je commente la ligne pygame.quit()
de la méthode de run
Game
, il me donne le message suivant:
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.
J'ai essayé googler cette erreur, mais peu de succès. Je ne peux pas me débarrasser du sentiment que j'essaye quelque chose que je ne devrais pas être, considérant que la fenêtre de Pygame est probablement un processus à part entière.
Je vous serais reconnaissant un aperçu et des recommandations sur l'endroit où lire
Je ne l'ai jamais essayé ce que vous faites, mais je suppose que la question a à voir avec où 'pygame .init' est appelé. Je pense qu'il sera appelé dans les processus principaux quand il construit l'instance 'Game', et non dans le processus enfant (qui ne se déroule que lorsque' start() 'est appelé). Essayez de déplacer les appels 'pygame.init' et' pygame.display.set_mode' en haut de 'run' et voyez si cela fonctionne. – Blckknght
Je semble me rappeler que pygame ne peut pas gérer le multiprocessing ou le threading du tout. – oxrock
@Blckknght cela semble avoir résolu ce problème – Jytug