【问题标题】:multiprocessing apply_async block GUI in wxPythonwxPython中的多处理apply_async块GUI
【发布时间】:2014-01-24 09:01:57
【问题描述】:

我的一些方法涉及到 os.chdir。在多线程中使用时,chdir会相互影响。

所以我尝试了 multiprocess.Pool 在不同的进程中调用这些方法并且它起作用了。 直到我在 GUI 中调用这些方法。

在wxPython中使用multiprocessing.Pool时,用apply_async调用的方法还是卡住了GUI,如何解决?

class MyFrame(wx.Frame):

    def __init__(self):
        super(MyFrame, self).__init__(None, -1, 'My Frame', size=(500, 300))
        self.pool = multiprocessing.Pool(maxtasksperchild=1)
        panel = wx.Panel(self, -1)
        self.screen = wx.TextCtrl(panel, -1, '', size=(500, 200), style=wx.TE_MULTILINE | wx.TE_READONLY)
        vbox = wx.BoxSizer(wx.VERTICAL)
        vbox.Add(self.screen, flag=wx.EXPAND)
        vbox.Add(wx.Button(panel, 1, label='Block'), flag=wx.BOTTOM)
        vbox.Add(wx.Button(panel, 2, label='Non-Block'), flag=wx.BOTTOM)
        panel.SetSizer(vbox)

        self.Bind(wx.EVT_BUTTON, self.onBlock, id=1)
        self.Bind(wx.EVT_BUTTON, self.onNonBlock, id=2)

    def onNonBlock(self, event):
        self.pool.apply_async(self.long_job(4))

    def onBlock(self, event):
        self.long_job(4)

    def callback(self, x):
        self.screen.WriteText('callback %s\n' % x)

    def long_job(self, x):
        self.screen.WriteText('enter %s\n' % x)
        for i in range(x):
            self.screen.WriteText('running %s\n' % i)
            os.chdir('dir_%s' % x)
            time.sleep(1)
        self.screen.WriteText('exit %s\n' % x)

【问题讨论】:

  • 你觉得这个怎么样?我在下面的回答有帮助吗?

标签: wxpython multiprocessing


【解决方案1】:

您的 GUI 冻结,因为您没有给应用程序处理时间来重绘图形元素。

要纠正这个问题,您需要为 wx 提供这个机会。一种方法是在 long_job 中调用 wx.Yield()

def long_job(self, x):
    self.screen.WriteText('enter %s\n' % x)
    for i in range(x):
        self.screen.WriteText('running %s\n' % i)
        os.chdir('dir_%s' % x)
        wx.Yield()   ### Allow graphical processing before sleeping
        time.sleep(1)     
    self.screen.WriteText('exit %s\n' % x)

【讨论】:

  • 这并没有提供问题的答案。要批评或要求作者澄清,请在其帖子下方发表评论。
  • @StarsSky:现在好点了吗?
猜你喜欢
  • 1970-01-01
  • 2012-06-11
  • 2018-07-26
  • 1970-01-01
  • 2020-10-30
  • 1970-01-01
  • 2019-04-05
  • 1970-01-01
  • 2020-08-29
相关资源
最近更新 更多