Как открыть несколько 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 есть несколько слоев. Начиная с верхнего слоя,

  1. PyGame
  2. SDL
  3. Xlib
  4. LibXCB

Благодаря многопроцессорности ваш процесс будет вызывать fork() скопировать себя. Однако копии являются несовершенными, и некоторые фрагменты кода могут работать неправильно после разветвления.

В частности, LibXCB написан с предположением, что он владеет соединением с сервером X11. После разветвления это уже не так. Оба процесса будут совместно использовать соединение с X11, а сообщения от сервера X11 будут приниматься только одним из процессов, совместно использующих соединение с X11.

Представьте, что вы разговариваете с кем-то с помощью текстовых сообщений, за исключением того, что некоторые ваши сообщения отправляются Алисе, а другие сообщения отправляются Бобу. Никто не говорил вам, что это происходит. Разговор не имеет никакого смысла. Вот что здесь происходит.

Вы: Что случилось? [Алиса получает это сообщение]

Алиса: я смотрю фильм.

Вы: Какой фильм вы смотрите? [Боб получает это сообщение]

Боб: Я не смотрю фильм, о чем ты говоришь?

Решения

  • использование threading вместо multiprocessing

  • Используйте только PyGame из одного из процессов и убедитесь, что процесс не разворачивается.

  • Использовать forkserver (или же spawn) начать метод с multiprocessing,

  • Спавн совершенно разные процессы.

Другие вопросы по тегам