Python / wxPython:在后台持续工作

时间:2009-04-08 15:55:07

标签: python multithreading wxpython background

我正在制作一个用Python运行模拟的程序,带有一个wxPython接口。在程序中,您可以创建模拟,程序为您渲染(=计算)它。有时渲染可能非常耗时。

当用户启动模拟并定义初始状态时,我希望程序在后台连续渲染模拟,而用户可能在程序中执行不同的操作。有点类似于填充的YouTube风格的条形图:您可以仅在渲染点播放模拟。

我应该如何运行渲染功能?

4 个答案:

答案 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。我觉得很容易亲自使用。