Python中Queue.task_done()與Queue.join()與thread.join()
阿新 • • 發佈:2021-11-09
Queue.task_done() 與 Queue.join()
使用queue一般用於線上程間傳遞資料,通過queue.put()與queue.get()來獲取任務資料,通常需要在任務執行完成之後進行下一步操作,如果單純靠判斷queue是否為空不能判斷任務是否結束,queue為空,但任務可能還在執行中,所以需要queue.join()來阻塞等待,而queue.task_done()來告訴queue.join()任務是否結束。
比如:
import logging import queue import threading import time items_queue = queue.Queue() running = False def items_queue_worker(): while running: try: item = items_queue.get(timeout=0.01) if item is None: continue try: process_item(item) finally: items_queue.task_done() except queue.Empty: pass except: logging.exception('error while processing item') def process_item(item): print('processing {} started...'.format(item)) time.sleep(0.5) print('processing {} done'.format(item)) if __name__ == '__main__': running = True worker_threads = 10 thread_list = [] for _ in range(worker_threads): t = threading.Thread(target=items_queue_worker) t.start() thread_list.append(t) for i in range(100): items_queue.put(i) items_queue.join() print('all task done') for t in thread_list: print(t.isAlive())
上面的程式碼,如果沒有items_queue.task_done()則join阻塞,'all task done'以及下面判斷執行緒是否alive永遠不會被列印。
Queue.join()與thread.join()
在上面join等待結束,列印all task done之後,t.isAlive的結果為True,此時執行緒是仍舊執行的,而thread.join()是線上程結束isAlive結果為False才結束阻塞,繼續執行其他任務。