在Mac OS 10.7上使用带有pygame的IO的python多处理模块

时间:2011-11-12 17:02:04

标签: python macos osx-lion multiprocessing pygame

我使用pygame在认知科学中运行实验,并且我经常需要大量的I / O,因此我喜欢将这些任务分离到单独的进程(使用多核机器时)以提高代码的性能。但是,我遇到了一些代码可以在我的同事的Linux机器(Ubuntu LTS)上运行但不在我的mac上的情况。下面是代表最小可再现示例的代码。我的mac是2011 Macbook Air运行10.7.2并使用默认的python 2.7.1。我尝试通过pre-built binary安装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 个答案:

答案 0 :(得分:4)

也许你应该在每个分叉(子)进程中初始化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()

答案 1 :(得分:2)

试试这个链接:

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

这可能会有所帮助。问题是你正在创建一个永不停止的过程。这应该被声明为一个守护进程:

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

不确定这是否能解决问题,我只是在了解多处理模块,因为我发布了这个。

答案 2 :(得分:0)

您是否尝试过使用线程代替进程?在OS X中使用python多处理模块之前我遇到了问题。http://docs.python.org/library/threading.html