def worker():
while True:
item = q.get()
do_work(item)
q.task_done()
q = Queue()
for i in range(num_worker_threads):
t = Thread(target=worker)
t.daemon = True
t.start()
for item in source():
q.put(item)
q.join() # block until all tasks are done
私は分かりませんが、ワーカースレッドが完了して存在する方法です。アイテムが利用可能になるまでq.get()ブロックを読んだので、すべてのアイテムが処理され、キューに何も残らない場合、q.get()が永遠にブロックされないのはなぜですか?
このソリューションはかなり危険です。ワーカースレッドが速い場合、キューに項目が追加される前に 'q.empty()'をテストしてから、何もしないうちに終了します。同様に、キューに1つのアイテムが残っていて、2つのスレッドが 'q.empty()'を同時にテストすると、それらは両方とも続行しますが、1つはアイテムをキューから取得し、もう1つは 'q.get() '。 –