Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Mac OS 10.7上使用pygame的python IO多处理模块_Python_Macos_Osx Lion_Multiprocessing_Pygame - Fatal编程技术网

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

在Mac OS 10.7上使用pygame的python IO多处理模块,python,macos,osx-lion,multiprocessing,pygame,Python,Macos,Osx Lion,Multiprocessing,Pygame,我使用pygame来运行认知科学的实验,通常我有大量的I/O需求,所以我喜欢将这些任务分开处理(当使用多核机器时),以提高代码的性能。然而,我遇到了一个场景,其中一些代码可以在我同事的linux机器(UbuntuLTS)上运行,但不能在我的mac上运行。下面是表示最小可复制示例的代码。My mac是一款运行10.7.2并使用默认python 2.7.1的2011 Macbook Air。我尝试了通过安装的pygame,并且在从源代码安装SDL和pygame之后也进行了尝试 import pyga

我使用pygame来运行认知科学的实验,通常我有大量的I/O需求,所以我喜欢将这些任务分开处理(当使用多核机器时),以提高代码的性能。然而,我遇到了一个场景,其中一些代码可以在我同事的linux机器(UbuntuLTS)上运行,但不能在我的mac上运行。下面是表示最小可复制示例的代码。My mac是一款运行10.7.2并使用默认python 2.7.1的2011 Macbook Air。我尝试了通过安装的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.
然后我得到了一份复制到的坠机报告


关于如何解决这个问题有什么建议吗?

您是否尝试过使用线程而不是进程?在OS X中使用python多处理模块之前,我遇到过一些问题。

也许您应该在每个分叉(子)进程中初始化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()
请尝试以下链接:

这可能会有帮助。问题是,您正在创建一个永不停止的过程。应将其声明为守护程序:

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

不确定这是否能解决问题,我只是在发布这篇文章时学习多处理模块。

哇,你有一个简单的例子和一个清晰、简洁的现象,听起来很像一个bug。为什么不呢?看来你在那里的运气会更好。你提交的是。维护一个任何人都可以遵循的链是一个好主意。我的理解是python中的线程仍然受到全局解释器锁的约束,这减少了它们的好处,而且SDL(pygame所依赖的)存在线程问题。这可以防止崩溃,但如果我尝试在主进程中也使用pygame(例如,用于绘制屏幕),我得到了与前面报告的相同的行为。@Mike You应该在分叉子进程后才在主进程中初始化pygame。这个想法是为了避免在分叉之前初始化pygame!我更新了示例以反映这一点。几乎就在这里!虽然您发送的代码可以工作,但当您实际尝试在子进程中收集输入时,这个想法就失败了le在家长中全屏显示任何内容,因为一旦家长创建全屏窗口,它就会从孩子那里窃取焦点,让孩子无法检测输入。有没有想法解决这个问题?@Mike Delay您的全屏模式,在所有孩子都从pygame角度完全初始化后,使用多处理sinchro如果您对进程同步对象没有经验,只需在主进程中休眠(几秒钟),以查看您是否处于良好状态,google it或更高版本我也可以帮助您进行同步。@Mike Seams您遇到的其他问题与原始问题相同…您能添加与第二个问题相关的更多详细信息吗?