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

Was this helpful?