Python Queue(佇列)
Queue
模組實現了多生產者、多消費者佇列。當必須在多個執行緒之間安全地交換資訊時,它線上程程式設計中特別有用,
實現了所有必需的鎖定語義。
一、該模組實現了三種類型的佇列,它們的區別僅在於檢索條目的順序:
1、FIFO 佇列,其新增的第一個任務是第一個檢索的任務。
2、LIFO 佇列,其最近新增的條目是第一個檢索的(像堆疊一樣執行)。
3、Priority 佇列,其條目將保持排序,並首先檢索最低值的條目。
二、該模組定義了以下類和異常:
-
class
Queue.
Queue
(maxsize = 0 )
FIFO佇列的建構函式。 maxsize 是一個整數,用於設定可以放入佇列的專案數的上限。達到此大小後,插入將阻止,直到消耗佇列項。如果 maxsize 小於或等於零,則佇列大小為無限大。
-
class
Queue.
LifoQueue
(maxsize = 0 )
LIFO佇列的建構函式。 maxsize 是一個整數,用於設定可以放入佇列的專案數的上限。達到此大小後,插入將阻止,直到消耗佇列項。如果 maxsize 小於或等於零,則佇列大小為無限大。
-
class
Queue.
PriorityQueue
(maxsize = 0 )
Priority佇列的建構函式。 maxsize 是一個整數,用於設定可以放入佇列的專案數的上限。達到此大小後,插入將阻止,直到消耗佇列項。如果 maxsize 小於或等於零,則佇列大小為無限大。
-
exception
Queue.
Empty
在queue物件為空時呼叫非阻塞 get()
或 get_nowait()
時引發異常。
-
exception
Queue.
Full
在queue物件已滿時呼叫非阻塞 put()
或 put_nowait()
時引發異常。
三、queue物件提供下面描述的公共方法:
Queue. qsize ()
返回佇列的大致大小(非準確值)。
Queue. empty ()
如果佇列為空則返回True,否則返回False(僅限當前,不保證後續情況)。
Queue. full ()
如果佇列已滿則返回True,否則返回False(僅限當前,不保證後續情況)。
Queue . put (item [,block [,timeout ] ] )
將item放入佇列。如果可選引數block為true 且 timeout為None,則在必要時阻止,直到有空閒槽可用。如果 timeout是一個正數,它會阻止最大超時時間,如果在該時間內沒有可用的空閒槽,則會引發Full異常。
反之(block為false),如果有空閒槽可以立即使用,則將item放入佇列,否則引發Full異常(在這種情況下忽略超時)。
Queue. put_nowait (item)
相當於 put(item, False )。
Queue. get ([ block [,timeout ] ] )
從佇列中刪除並返回一個item。 如果可選的args塊為true且timeout為None(預設值),則在必要時阻止,直到某個項可用為止。 如果timeout是一個正數,它會阻止最多超時秒,如果在該時間內沒有可用的項,則會引發Empty異常。
反之(block為false),如果有item可以立即使用,則返回該tem,否則引發Empty異常(在這種情況下忽略超時)。
Queue. get_nowait()
相當於 get(False )。
四、queue物件還提供了兩種方法來支援跟蹤守護程序、消費者執行緒是否已完全處理入隊任務:
-
Queue.
task_done
()
表示之前佇列的任務已完成。 由佇列消費者執行緒使用。對於用於獲取任務的每個get(),對task_done()的後續呼叫會告知佇列該任務的處理已完成。
如果join() 當前正阻塞,則它將在所有條目都已處理後恢復(這意味著已為每個已放入佇列的條目收到task_done()呼叫)。
如果呼叫的次數超過佇列中放置的條目,則引發ValueError。
-
Queue.
join
()
阻止直到佇列中的所有條目都已獲取並處理完畢。
每當條目新增到佇列時,未完成任務的計數就會增加。每當消費者執行緒呼叫task_done()
以指示該條目已被檢索並且其上的所有工作都已完成時,計數就會下降。當未完成任務的數量降至零時,join()
取消阻止。
如何等待佇列任務完成的示例:
def worker(): while True: item = q.get() do_work(item) q.task_done() q = Queue() for i in range(num_worker_threads): t = Thread(target=worker) t.daemon = True t.start() for item in source(): q.put(item) q.join()# block until all tasks are done