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

Mik*_*nce 14 python macos pygame multiprocessing osx-lion

我使用pygame在认知科学中运行实验,并且我经常需要大量I/O,因此我喜欢将这些任务分离到单独的进程(使用多核机器时)以提高代码的性能.但是,我遇到了一些代码可以在我的同事的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
Run Code Online (Sandbox Code Playgroud)

正如代码中所指出的,罪魁祸首似乎是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.
Run Code Online (Sandbox Code Playgroud)

然后我收到一份崩溃报告,复制到这个要点.

有关如何解决此问题的任何建议?

Nic*_*alu 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()
Run Code Online (Sandbox Code Playgroud)