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() 回傳