使用队列的Python多线程 - 程序永远被阻止

时间:2014-01-23 00:56:42

标签: python multithreading queue block

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

    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()

提前致谢。

1 个答案:

答案 0 :(得分:2)

您正在调用out_queue.join(),等待out_queue.task_done()被调用的次数out_queue.put()被调用out_queue.task_done()。但是,你永远不会打电话给out_queue.join()。最好不要先调用queue来解决这个问题。

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

相关问题