Использование многопроцессорного модуля python для ввода-вывода с pygame в Mac OS 10.7 - PullRequest
14 голосов
/ 12 ноября 2011

Я использую pygame для проведения экспериментов в когнитивной науке, и часто у меня высокие требования к вводу / выводу, поэтому мне нравится разбивать эти задачи на отдельные процессы (при использовании многоядерной машины) для повышения производительности моего кода.Однако я столкнулся со сценарием, когда некоторый код работает на машине Linux моего коллеги (Ubuntu LTS), но не на моем Mac.Ниже приведен код, представляющий минимальный воспроизводимый пример.Мой Mac 2011 Macbook Air работает под управлением 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.

Затем я получаю отчет о сбое, скопированный в this gist .

Есть предложения как это исправить?

Ответы [ 3 ]

4 голосов
/ 18 ноября 2011

Возможно, вам следует инициализировать 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 голосов
/ 01 декабря 2012

Попробуйте эту ссылку:

http://www.slideshare.net/dabeaz/an-introduction-to-python-concurrency#btnPrevious

Это может помочь.Проблема в том, что вы создаете процесс, который никогда не останавливается.Это должно быть объявлено как демон:

p = multiprocessing.Process(target=f)
p.daemon = True
p.start()

Не уверен, что это решит проблему, я просто изучаю модуль многопроцессорности, когда выкладываю это.

0 голосов
/ 17 ноября 2011

Вы пробовали использовать потоки вместо процессов?У меня были проблемы перед использованием модуля многопроцессорной обработки Python в OS X. http://docs.python.org/library/threading.html

...