For the complete documentation index, see llms.txt. This page is also available as Markdown.
Page cover

full(), empty(), qsize()


full() 用於檢查隊列是否已滿。 如果隊列已滿則返回 True,否則返回 False。

Queue 物件必須使用 maxsize 參數進行初始化,否則,full() 將始終返回 False,因為 queue 永遠不會被視為已滿。

PYTHON
from queue import Queue

# Create queue
q = Queue(maxsize=5)

# Add elements
for i in range(5):
    q.put(i)

print(q.full())  # Output: True

empty() 如果 queue 為空返回 True,否則返回 False

PYTHON
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 中的項目數量。

範例 – 生產者-消費者問題


生產者-消費者問題(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 Class 常用於 threads 間通信和協調,其中一個 thread 將項目添加到 queue (producer),另一個 thread 從 queue (consumer) 獲取項目。

範例


執行結果:

執行結果:

參考資料


queue --- 同步佇列 (queue) class(類別) — Python 3.11.4 說明文件

Python - queue.task_done() 用於什麼? - 堆棧溢出

Python daemon thead 解說 | My.APOLLO

[Python] Daemon Thread | 羅倫斯的IT航海日誌 - 點部落

在 Python 中排隊 task_done() 和 join()

Python 中的優先級隊列 - GeeksforGeeks

Last updated