我使用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。
有关如何解决此问题的任何建议吗?
答案 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