簡體   English   中英

在Mac OS 10.7上使用帶有pygame的IO的python多處理模塊

[英]Using the python multiprocessing module for IO with pygame on Mac OS 10.7

我使用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

正如代碼中所指出的,罪魁禍首似乎是將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.

然后我收到一份崩潰報告,復制到這個要點

有關如何解決此問題的任何建議?

也許您應該在每個分叉(子)進程中初始化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()

試試這個鏈接:

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

它可能有所幫助。 問題是你正在創建一個永不停止的過程。 這應該被聲明為一個守護進程:

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

不確定這是否會解決問題,我只是在了解多處理模塊,因為我發布了這個。

您是否嘗試過使用線程而不是進程? 在OS X中使用python多處理模塊之前我遇到了一些問題.http: //docs.python.org/library/threading.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM