我正在用一個wxPython接口製作一個在Python中運行模擬的程序。在程序中,你可以創建一個模擬,程序爲你渲染(=計算)它。渲染可能會非常耗時。Python/wxPython:在後臺連續工作
當用戶開始模擬並定義初始狀態時,我希望程序在後臺持續渲染模擬,而用戶可能在程序中做了不同的事情。有點像填滿了YouTube風格的欄:您可以僅在渲染的點上播放模擬。
我該如何運行渲染功能?
我正在用一個wxPython接口製作一個在Python中運行模擬的程序。在程序中,你可以創建一個模擬,程序爲你渲染(=計算)它。渲染可能會非常耗時。Python/wxPython:在後臺連續工作
當用戶開始模擬並定義初始狀態時,我希望程序在後臺持續渲染模擬,而用戶可能在程序中做了不同的事情。有點像填滿了YouTube風格的欄:您可以僅在渲染的點上播放模擬。
我該如何運行渲染功能?
啓動一個新的進程在後臺進行渲染並定期檢查它是否返回。
您可以找到子過程模塊here和多處理模塊here的文檔。正如Jay所說,如果您使用Python 2.6,多進程可能會更好。也就是說,我不認爲兩者之間會有任何性能差異。多進程似乎是子進程的一個包裝,使得某些事情更容易完成。
儘管子流程/多進程是執行此操作的標準方式,但您也可以查看Parallel Python。
我會使用threading.Thread
在後臺運行代碼並wx.CallAfter
將更新發布到我的窗口線程以呈現給用戶。
thread = threading.Thread(target=self.do_work)
thread.setDaemon(True)
thread.start()
...
def do_work(self):
# processing code here
while processing:
# do stuff
wx.CallAfter(self.update_view, args, kwargs)
def update_view(self, args):
# do stuff with args
# since wx.CallAfter was used, it's safe to do GUI stuff here
如果你不介意使用一個非常略有不同的方法,你可以看看stackless蟒蛇,併爲您呈現過程的微進程。我發現個人使用非常簡單。
在wxPython wiki about long running tasks上有一些可能有用的信息。他們基本上使用線程和wx.PostEvent
來處理線程和主wx事件循環之間的通信。
我從來沒有使用過多個進程。我從哪說起呢?另外,我明白有不同的方法。我應該選擇哪一個? – 2009-04-08 16:04:03