
full(), empty(), qsize()
full() 用於檢查隊列是否已滿。 如果隊列已滿則返回 True,否則返回 False。
Queue 物件必須使用 maxsize 參數進行初始化,否則,full() 將始終返回 False,因為 queue 永遠不會被視為已滿。
from queue import Queue
# Create queue
q = Queue(maxsize=5)
# Add elements
for i in range(5):
q.put(i)
print(q.full()) # Output: Trueempty() 如果 queue 為空返回 True,否則返回 False。
import queue
# Create a new queue
my_queue = queue.Queue()
# Check queue
if my_queue.empty():
print("The queue is empty.") # ✔️✔️
else:
print("The queue is not empty.")qsize() 是一個返回 queue 大致大小,通常用於檢查當前 queue 中的項目數量。
由於 multithreading semantics (多線程語義),此計數不可靠,並且由於與 parallel processing 相關的固有競爭條件,不能保證準確的計數。
因此不應依賴它們來精確追蹤 queue 大小,而是作為粗略指南。
範例 – 生產者-消費者問題
生產者-消費者問題(Producer-Consumer problem)是一個經典的同步問題,非常適合在multi-threading context 中理解 qsize() 方法。
Deadlock 情況: consumer() 是一個無限迴圈 while True:,只要程序在運行,它就會繼續執行。 因此即使 queue 為空,consumer() 也會繼續運行,導致 deadlock。
您可以透過使用 None 作為標記值 (Sentinel value),producer() 在完成生產後會將 None 放入 queue 中。 consumer() 檢查獲取的每個項目,如果該項目為 None,則它會跳出迴圈。
執行結果:
範例 – Feedback loop
如果您希望 Producer 和 Consumer 始終相等,使 Producer 僅在消耗了前一個物品後才生產新項目。 實現此目的的一種方法是使用另一個 queue 在某個項目被消耗時,向 Producer 發出信號。 這有時被稱為 feedback loop (反饋循環)。
執行結果:
執行結果:
範例 – 監控 Queue 的大小
儘管 qsize() 對於精確計數並不總是可靠,但它在您需要以非關鍵的方式監視 queue 大小的情況下很有用。例如:定期 log queue 大小、queue 超過一定大小時觸發 action。
假設您有一個系統,Producer 將任務添加到 queue 中,而 Consumer 將任務從 queue 中刪除。 如果 queue 變得太大,可能表明 Consumer 無法跟上 Producer,這可能是出現問題的徵兆。
執行結果:
join(), task_done()
join() 用於阻塞 main thread,直到接收並處理 queue 中的所有項目(即,每個項目調用 task_done()。) 如果不調用 task_done(),q.join() 將無限期地阻塞。
task_done() 指示先前 enqueued 任務已完成(告訴 queue 該項目已被處理)。它經常與 multi-threading 或 multi-processing 結合使用。
當 Producer thread 完成任務時,應該調用 task_done()。 這很重要,特別是當您使用 join() 時,它會 block thread,直到 queue 中的所有項目都已獲取並處理完畢(意味著已為每個項目調用 task_done())。
範例
執行結果:
執行結果:
參考資料
queue --- 同步佇列 (queue) class(類別) — Python 3.11.4 說明文件
Python - queue.task_done() 用於什麼? - 堆棧溢出
Python daemon thead 解說 | My.APOLLO
[Python] Daemon Thread | 羅倫斯的IT航海日誌 - 點部落
Last updated
Was this helpful?