Использование модуля многопроцессорности python для ввода-вывода с pygame на Mac OS 10.7
Я использую pygame для запуска экспериментов в когнитивной науке, и часто у меня есть тяжелые требования ввода-вывода, поэтому я хотел бы отбросить эти задачи для разделения процессов (при использовании многоядерной машины) для повышения производительности моего кода. Тем не менее, я столкнулся с сценарием, когда какой-то код работает на моей коллеге Linux-машине (Ubuntu LTS), но не на моем mac. Ниже приведен код, представляющий минимальный воспроизводимый пример. Мой mac - это MacBook Air 2011, работающий 10.7.2 и использующий по умолчанию python 2.7.1. Я попробовал оба pygame как установленный через предварительно построенный двоичный файл, и затем я также попытался установить как SDL, так и pygame из источника.
import pygame
import multiprocessing
pygame.init()
def f():
while True:
pygame.event.pump() #if this is replaced by pass, this code works
p = multiprocessing.Process(target=f)
p.start()
while True:
pass
Как отмечено в коде, кажется, что виновник ставит pygame.event.pump()
в отдельный процесс. Когда я запускаю это на своем mac, я сначала получаю следующую распечатку в терминале:
The process has forked and you cannot use this CoreFoundation functionality safely. You MUST exec().
Break on __THE_PROCESS_HAS_FORKED_AND_YOU_CANNOT_USE_THIS_COREFOUNDATION_FUNCTIONALITY___YOU_MUST_EXEC__() to debug.
Затем я получаю отчет о сбое, скопированный в этот смысл.
Любые предложения по устранению этого?
Ответы
Ответ 1
Возможно, вы должны инициализировать pygame (который инициализирует SDL- > OpenGL) в каждом разветвленном (дочернем) процессе, таком как в примере:
import multiprocessing
def f():
import pygame
pygame.init()
while True:
pygame.event.pump()
if __module__ == "__main__"
p = multiprocessing.Process(target=f)
p.start()
import pygame
pygame.init()
while True:
pygame.event.pump()
Ответ 2
Попробуйте эту ссылку:
http://www.slideshare.net/dabeaz/an-introduction-to-python-concurrency#btnPrevious
Это может помочь. Проблема в том, что вы создаете процесс, который никогда не останавливается. Это должно быть объявлено как демон:
p = multiprocessing.Process(target=f)
p.daemon = True
p.start()
Не уверен, что это решит проблему, я просто узнаю о модуле многопроцессорности, поскольку я публикую это.
Ответ 3
Пробовали ли вы использовать потоки вместо процессов? У меня были проблемы перед использованием модуля многопроцессорности python в OS X. http://docs.python.org/library/threading.html