queue --- 同步佇列 (synchronized queue) 類別

原始碼:Lib/queue.py


queue module(模組)實作多生產者、多消費者佇列。在執行緒程式設計中,必須在多執行緒之間安全地交換資訊時,特別有用。此 module 中的 Queue class 實作所有必需的鎖定語義 (locking semantics)。

此 module 實作三種型別的佇列,它們僅在取出條目的順序上有所不同。在 FIFO 佇列中,先加入的任務是第一個被取出的。在 LIFO 佇列中,最近被加入的條目是第一個被取出的(像堆疊 (stack) 一樣操作)。使用優先佇列 (priority queue) 時,條目將保持排序狀態(使用 heapq module),並先取出最低值條目。

在內部,這三種型別的佇列使用鎖 (lock) 來暫時阻塞競爭執行緒;但是,它們並不是被設計來處理執行緒內的 reentrancy(可重入)。

此外,此 module 實作一個「簡單」的 FIFO 佇列型別 SimpleQueue,其特定的實作是以較少的功能為代價,來提供額外的保證。

queue module 定義了以下的 class 和例外:

class queue.Queue(maxsize=0)

FIFO 佇列的建構子 (constructor)。maxsize 是一個整數,用於設置佇列中可放置的項目數的上限。一旦達到此大小,插入將會阻塞,直到佇列中的項目被消耗。如果 maxsize 小於或等於零,則佇列大小為無限。

class queue.LifoQueue(maxsize=0)

LIFO 佇列的建構子。maxsize 是一個整數,用於設置佇列中可放置的項目數的上限。一旦達到此大小,插入將被鎖定,到佇列中的項目被消耗。如果 maxsize 小於或等於零,則佇列大小為無限。

class queue.PriorityQueue(maxsize=0)

優先佇列的建構子。maxsize 是一個整數,用於設置佇列中可放置的項目數的上限。一旦達到此大小,插入將被阻塞,直到佇列中的項目被消耗。如果 maxsize 小於或等於零,則佇列大小為無限。

最低值的條目會最先被取出(最低值的條目是被會 min(entries) 回傳的那一個)。條目的典型模式是格式為 (priority_number, data) 的 tuple(元組)。

如果 data 元素為不可比較的,則可以將資料包裝在一個 class 中,該 class 忽略資料項目並僅比較優先數:

from dataclasses import dataclass, field
from typing import Any

@dataclass(order=True)
class PrioritizedItem:
    priority: int
    item: Any=field(compare=False)
class queue.SimpleQueue

無界的 FIFO 佇列的建構子。簡單佇列缺少任務追蹤等進階功能。

在 3.7 版被加入.

exception queue.Empty

當對一個空的 Queue 物件呼叫非阻塞的 (non-blocking) get()(或 get_nowait())將引發此例外。

exception queue.Full

當對一個已滿的 Queue 物件呼叫非阻塞的 put()(或 put_nowait())將引發此例外。

exception queue.ShutDown

當對一個已關閉的 Queue 物件呼叫 put()get() 時將引發此例外。

在 3.13 版被加入.

佇列物件

佇列物件(QueueLifoQueuePriorityQueue)提供下面描述的公用 method。

Queue.qsize()

回傳佇列的近似大小。注意,qsize() > 0 並不能保證後續的 get() 不會阻塞,qsize() < maxsize 也不會保證 put() 不會阻塞。

Queue.empty()

如果佇列為空,則回傳 True,否則回傳 False。如果 empty() 回傳 True,則不保證後續呼叫 put() 不會阻塞。同樣,如果 empty() 回傳 False,則不保證後續呼叫 get() 不會阻塞。

Queue.full()

如果佇列已滿,則回傳 True ,否則回傳 False。如果 full() 回傳 True,則不保證後續呼叫 get() 不會阻塞。同樣,如果 full() 回傳 False,則不保證後續呼叫 put() 不會阻塞。

Queue.put(item, block=True, timeout=None)

item 放入佇列中。如果可選的 args block 為 true、timeoutNone(預設值),則在必要時阻塞,直到自由槽 (free slot) 可用。如果 timeout 為正數,則最多阻塞 timeout 秒,如果該時間內沒有可用的自由槽,則會引發 Full 例外。否則(block 為 false),如果自由槽立即可用,則將項目放在佇列中,否則引發 Full 例外(在這種情況下,timeout 將被忽略)。

如果佇列已被關閉,則引發 ShutDown

Queue.put_nowait(item)

等效於 put(item, block=False)

Queue.get(block=True, timeout=None)

從佇列中移除並回傳一個項目。如果可選的 args block 為 true,且 timeoutNone(預設值),則在必要時阻塞,直到有可用的項目。如果 timeout 是正數,則最多會阻塞 timeout 秒,如果該時間內沒有可用的項目,則會引發 Empty 例外。否則(block 為 false),如果立即可用,則回傳一個項目,否則引發 Empty 例外(在這種情況下,timeout 將被忽略)。

在 POSIX 系統的 3.0 版之前,以及 Windows 的所有版本,如果 block 為 true 且 timeoutNone,則此操作將在底層鎖上進入不間斷等待。這意味著不會發生例外,特別是 SIGINT(中斷訊號)不會觸發