为什么这个线程代码不能同时运行?

时间:2012-10-12 04:22:12

标签: python multithreading

我正在尝试编写一些gui代码来摆脱组合框中的延迟。用户选择的选项在后台进行一些Web抓取,并且根据他们选择的选项,当程序寻找所需的数据时,滞后有时可能很大。

对于docs,似乎要启动一个线程,我只需要使用适当的参数调用threading.Thread。所以,我在代码中的尝试如下:

def EvtComboBox(self, event):
    self.statusBox.AppendText('Fetching ' + event.GetString() + ' data.\n')
    loadingThread = threading.Thread(target=self.doStuff(event), name='i_am_a_thread')
    loadingThread.start()
    threading.Thread(target=self.checker(loadingThread)).start()

def doStuff(self, event):
    self.statusBox.AppendText(event.GetString() + ':\n')        
    self.assets = self.scraper.loadConferencePage(event.GetString())
    self.statusBox.AppendText(str(self.scraper.getNumOfNewHandouts(self.assets)) + ' new handout(s) in Asset Manager\n' + 
                                '-------------------------\n\n')

def checker(self, loadingThread):
    while threading.Thread.isAlive(loadingThread):
        print True

我期待的行为是loadingthread启动,并开始从网络中获取所需的数据。虽然它正在这样做,我认为我创建的第二个线程将监视第一个线程,我最后的假设是,由于这两个线程“并发”运行,EvtComboBox方法将完成,并且gui中的组合框将关闭。

但是,这一切都不会发生。触发EvtComboBox方法,然后代码似乎完全按顺序运行。如果我在两个线程下面粘贴一个print语句(只是为了看它何时被执行,

def EvtComboBox(self, event):
    self.statusBox.AppendText('Fetching ' + event.GetString() + ' data.\n')
    loadingThread = threading.Thread(target=self.doStuff(event), name='i_am_a_thread')
    loadingThread.start()
    threading.Thread(target=self.checker(loadingThread)).start()
    print 'EvtComboBox method finished'

只有在线程调用的代码运行后才会执行 ...所以..我不确定它为什么会以这种方式运行。

为什么不同时执行?

1 个答案:

答案 0 :(得分:4)

target threading.Thread部分你不应该调用函数,而是给它函数对象和参数;例如threading.Thread(target=self.checker args=loadingThread).start()