Использование модуля многопроцессорности 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