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