wxPython中的多处理apply_async块GUI

时间:2014-01-24 09:01:57

标签: wxpython multiprocessing

我的一些方法涉及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)

1 个答案:

答案 0 :(得分:0)

您的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)