[英]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.