2014-01-23 49 views
1

我不确定我的程序的哪一部分是错误的。它将在两个队列的join()调用中被阻塞。但是,如果我删除了2个加入呼叫,则该程序根本不起作用。使用队列的Python多线程 - 程序永远被阻塞

import threading 
    import Queue 

    queue = Queue.Queue() 
    out_queue = Queue.Queue() 

    fruits = ['apple', 'strawberry', 'banana', 'peach', 'rockmelon'] 

    class WorkerThread(threading.Thread): 
     def __init__(self, queue, out_queue): 
      threading.Thread.__init__(self) 
      self.queue = queue 
      self.out_queue = out_queue 
     def run(self): 
      print 'run' 
      while not self.queue.empty(): 
       name = self.queue.get() 
       self.out_queue.put(name) 
       self.queue.task_done() 

    def main(): 
     print 'start' 
     for i in xrange(5): 
      t = WorkerThread(queue, out_queue) 
      t.setDaemon(True) 
      t.start() 
     #populate the queue 
     for fruit in fruits: 
      queue.put(fruit) 
     queue.join() 
     out_queue.join() 
     while not out_queue.empty(): 
      print out_queue.get() 
     print 'end' 

    if __name__=='__main__': 
     main() 

在此先感谢。

+0

刚注意到一些东西......你是否试图模拟在工作人员仍在运行时向'队列中添加更多项目? –

回答

2

您正在调用out_queue.join(),它等待,直到out_queue.task_done()被称为out_queue.put()被调用的次数相同。但是,你永远不会打电话out_queue.task_done()。这可以通过从不打电话out_queue.join()来解决。

编辑:此外,你开始WorkerThread s后填写queue。这意味着在您有机会插入所有元素之前,工作线程可能会运行并完成。在开始工作线程之前插入它们将解决此问题。

+0

就是这样;非常感谢! – 4af2e9eb6

+0

但还有一个问题,是它有时会起作用并打印所有的水果,但有时它不会,并且仍然阻塞,就好像我添加了out_queue.join()。 – 4af2e9eb6

+0

是的,试了一下,它的工作原理,非常感谢! – 4af2e9eb6