我正在制作一个用Python运行模拟的程序,带有一个wxPython接口。在程序中,您可以创建模拟,程序为您渲染(=计算)它。有时渲染可能非常耗时。
当用户启动模拟并定义初始状态时,我希望程序在后台连续渲染模拟,而用户可能在程序中执行不同的操作。有点类似于填充的YouTube风格的条形图:您可以仅在渲染点播放模拟。
我应该如何运行渲染功能?
答案 0 :(得分:7)
我会使用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
答案 1 :(得分:7)
wxPython wiki about long running tasks上有一些可能有用的信息。他们基本上使用一个线程和wx.PostEvent
来处理线程和主wx事件循环之间的通信。
答案 2 :(得分:4)
启动一个新进程以在后台渲染,并定期检查它是否已返回。
您可以找到子进程模块here和多进程模块here的文档。正如杰伊所说,如果你使用的是Python 2.6,那么多进程可能会更好。也就是说,我不认为两者之间会有任何性能差异。多进程似乎只是子进程的包装,使某些事情更容易做到。
虽然subprocess / multiprocess是执行此操作的标准方法,但您可能还需要查看Parallel Python。
答案 3 :(得分:0)
如果您不介意使用稍微不同的方法,可以查看stackless python并为渲染过程创建一个tasklet。我觉得很容易亲自使用。