【问题标题】:Python/wxPython: Doing work continuously in the backgroundPython/wxPython:在后台连续工作
【发布时间】:2010-10-18 08:31:37
【问题描述】:

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

当用户开始模拟并定义初始状态时,我希望程序在后台连续渲染模拟,而用户可能在程序中做不同的事情。有点像填满的 YouTube 风格栏:您只能播放模拟到渲染的点。

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

【问题讨论】:

    标签: python multithreading wxpython background


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      wxPython wiki about long running tasks 上有很多可能有用的信息。他们基本上使用线程和wx.PostEvent 来处理线程和主 wx 事件循环之间的通信。

      【讨论】:

        【解决方案3】:

        启动一个新进程以在后台渲染并定期检查它是否已返回。

        您可以找到子进程模块here 和多进程模块here 的文档。正如 Jay 所说,如果您使用 Python 2.6,多进程可能会更好。也就是说,我认为两者之间不会有任何性能差异。多进程似乎只是子进程的一个包装器,使某些事情更容易做。

        虽然子进程/多进程是执行此操作的标准方法,但您可能还想看看Parallel Python

        【讨论】:

        • 我以前从未使用过多个进程。我从哪里开始?另外,我知道有不同的方法可以做到这一点。我应该选择哪一个?
        • 注,请记住,由于这是一个用于进行模拟的程序,因此性能非常重要。
        • 如果您可以使用python 2.6,我相信多处理模块将是完成此任务的标准方式。它应该为您提供与您的操作系统和硬件一样多的性能。
        • 仅供参考,如果您使用带有 wxPython 的 Windows,最好使用 2.5 lists.wxwidgets.org/pipermail/wxpython-users/2009-March/…
        • 我还听说过 Stackless Python。是否相关?比子进程/多进程好吗?
        【解决方案4】:

        如果您不介意使用稍微不同的方法,您可以查看stackless python 并为您的渲染过程创建一个 tasklet。我个人觉得它很容易使用。

        【讨论】:

          猜你喜欢
          • 2013-09-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-12-27
          • 1970-01-01
          • 1970-01-01
          • 2017-09-19
          相关资源
          最近更新 更多