Многопоточность Python с использованием очереди - программа блокируется навсегда

Я не уверен, какая часть моей программы неверна. Он будет заблокирован при вызовах 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 ответ

Решение

Ты звонишь out_queue.join(), который ждет до out_queue.task_done() был вызван столько же раз out_queue.put() был вызван. Тем не менее, вы никогда не звоните out_queue.task_done(), Это лучше всего можно исправить, никогда не звоня out_queue.join() на первом месте.

РЕДАКТИРОВАТЬ: также вы заселяете queue после того, как вы начнете WorkerThreads. Это означает, что есть шанс, что рабочие потоки запустятся и завершатся, прежде чем вы сможете вставить все свои элементы. Вставка их перед запуском рабочего потока исправит это.

Другие вопросы по тегам