Как открыть несколько Pygame?
Я скачал игру, основанную на pygame: https://github.com/justinmeister/Mario-Level-1. Затем я открываю несколько терминалов, каждый терминал запускает эту игру, чтобы проверить, поддерживает ли она многопроцессорность. Все отлично.
Однако, когда я использую многопроцессорную библиотеку lib для запуска этой игры, возникает ошибка
CXIO: fatal IO error 11 (Resource temporarily unavailable) on X server ":0"
after 155 requests (155 known processed) with 0 events remaining.
Мой код такой:
processes = []
for rank in range(0, n):
p = mp.Process(target=main, args=())
p.start()
processes.append(p)
time.sleep(1)
processes[0].join()
Кто-нибудь может мне помочь? Любая помощь будет с благодарностью.
1 ответ
Многопроцессорность и GUI не смешиваются. Если вы хотите использовать многопроцессорность, то изолируйте многопроцессорную часть кода от части GUI (PyGame) и убедитесь, что код PyGame не запускается ни у одного из дочерних элементов, или что дочерние элементы не запускаются после запуска используя PyGame.
Или, как правило, не смешивайте многопроцессорность с PyGame.
Полное объяснение
На самом деле в PyGame есть несколько слоев. Начиная с верхнего слоя,
- PyGame
- SDL
- Xlib
- LibXCB
Благодаря многопроцессорности ваш процесс будет вызывать fork()
скопировать себя. Однако копии являются несовершенными, и некоторые фрагменты кода могут работать неправильно после разветвления.
В частности, LibXCB написан с предположением, что он владеет соединением с сервером X11. После разветвления это уже не так. Оба процесса будут совместно использовать соединение с X11, а сообщения от сервера X11 будут приниматься только одним из процессов, совместно использующих соединение с X11.
Представьте, что вы разговариваете с кем-то с помощью текстовых сообщений, за исключением того, что некоторые ваши сообщения отправляются Алисе, а другие сообщения отправляются Бобу. Никто не говорил вам, что это происходит. Разговор не имеет никакого смысла. Вот что здесь происходит.
Вы: Что случилось? [Алиса получает это сообщение]
Алиса: я смотрю фильм.
Вы: Какой фильм вы смотрите? [Боб получает это сообщение]
Боб: Я не смотрю фильм, о чем ты говоришь?
Решения
использование
threading
вместоmultiprocessing
Используйте только PyGame из одного из процессов и убедитесь, что процесс не разворачивается.
Использовать
forkserver
(или жеspawn
) начать метод сmultiprocessing
,Спавн совершенно разные процессы.