Python ドキュメントのコード例を次に示します。
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
次のようなユースケースに合わせて変更しました。
import threading
from Queue import Queue
max_threads = 10
q = Queue(maxsize=max_threads + 2)
def worker():
while True:
task = q.get(1)
# do something with the task
q.task_done()
for i in range(max_threads):
t = threading.Thread(target=worker)
t.start()
for task in ['a', 'b', 'c']:
q.put(task)
q.join()
実行すると、デバッガーはすべてのジョブが実行されたと表示しますが、q.join() は永遠に待機しているようです。すでにすべてのタスクを送信したというシグナルをワーカー スレッドに送信するにはどうすればよいですか?