1
Python的3文檔給一個使用隊列(https://docs.python.org/3/library/queue.html)一個工作線程的示例:何時需要Queue.join()?
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()'語句,是不是處理了隊列中的每個項目(並清除了所有線程)?通過加入所有的工作線程(最後一步),我們仍然在等待隊列中的所有項目進行處理。 – SMX
是的,我們仍在等待,但我認爲這是一種編碼安全措施。如果在處理隊列中的所有項目並且工人拿到一個之前添加了'None(無)'奇蹟般地添加了什麼?我認爲這只是一個枯燥程序化的例子,要確保你理解發生的事情,而不必完全理解隊列變爲FIFO(先入先出)。此外,這個例子可以適用於LIFO(Last In First Out)實施。但是,就目前的這個例子而言,我相信你可以取出'q.join()'而且沒關係。 – jarcobi889