Python 3文档给出了一个使用队列的工作线程示例(https://docs.python.org/3/library/queue.html):
def worker():
while True:
item = q.get()
if item is None:
break
do_work(item)
q.task_done()
q = queue.Queue()
threads = []
for i in range(num_worker_threads):
t = threading.Thread(target=worker)
t.start()
threads.append(t)
for item in source():
q.put(item)
# block until all tasks are done
q.join()
# stop workers
for i in range(num_worker_threads):
q.put(None)
for t in threads:
t.join()
在这个例子中,为什么需要使用
q.join()
?难道后续的 q.put(None)
和 t.join()
操作不能达到同样的效果,即阻塞主线程直到工作线程完成吗?
q.join()
语句,队列中的每个项目都会被处理(并且所有线程都会被清理)吗?通过加入所有工作线程(最后一步),我们仍然在等待处理队列中的所有项目。 - SMXNone
,并且一个工作人员得到了它,那会怎么样?我认为这只是一个繁琐的编程示例,以确保您理解正在发生的事情,而无需完全理解队列按FIFO(先进先出)进行。此外,这个示例可以适用于LIFO(后进先出)实现。但是,对于当前的示例,我认为您可以删除q.join()
,它也可以正常运行。 - jarcobi889