2014-01-23 146 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