Многопоточность 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
после того, как вы начнете WorkerThread
s. Это означает, что есть шанс, что рабочие потоки запустятся и завершатся, прежде чем вы сможете вставить все свои элементы. Вставка их перед запуском рабочего потока исправит это.