在Mac OS 10.7上使用Python多进程模块进行Pygame的IO操作
我在做认知科学实验的时候使用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.
然后我收到了一个崩溃报告,内容复制到了这个链接上。
有没有什么建议可以解决这个问题呢?
3 个回答
0
你有没有试过用线程而不是进程呢?我之前在OS X上使用Python的多进程模块时遇到过一些问题。你可以看看这个链接了解线程的相关内容:http://docs.python.org/library/threading.html
2
试试这个链接:
http://www.slideshare.net/dabeaz/an-introduction-to-python-concurrency#btnPrevious
这个可能会对你有帮助。问题在于你创建了一个永远不会停止的进程。这个进程应该被声明为守护进程:
p = multiprocessing.Process(target=f)
p.daemon = True
p.start()
我不确定这是否能解决问题,我在发这个的时候也在学习多进程模块。
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()