Python多執行緒3 queue

2022-09-18 21:18:15 字數 2607 閱讀 7474

queue模組實現了多生產者。多消費者佇列。在多執行緒環境下,該佇列能實現多個執行緒間安全的資訊交換。

模組實現了3種型別的佇列,差別在於佇列中條目檢索的順序不同。

在fifo佇列中。依照先進先出的順序檢索條目。在lifo佇列中,最後加入的條目最先檢索到(操作類似乙個棧)。在優先順序佇列中,條目被儲存為有序的(使用heapq模組)而且最小值的條目被最先檢索。

queue模組定義了以下的類和異常:

fifo佇列的構造器。maxsize為乙個整數。表示佇列的最大條目數。一旦佇列滿,插入將被堵塞直到佇列中存在空暇空間。假設maxsize小於等於0。佇列大小為無限。

lifo佇列的構造器。

maxsize是乙個整數,表示佇列的最大條目數。一旦佇列滿,插入將被堵塞直到佇列中存在空暇空間。假設maxsize小於等於0,佇列大小為無限。

優先順序佇列的構造器。maxsize是乙個整數,表示佇列的最大條目數。一旦佇列滿,插入將被堵塞直到佇列中存在空暇空間。

假設maxsize小於等於0,佇列大小為無限。

最小值的條目被最先檢索到(最小值的條目即為被sorted(list(entries))[0]返回的條目)。

通常乙個條目被儲存為以下的形式:(priority_number, data)。

當queue為空時,非堵塞的get()或者get_nowait()被呼叫時,將丟擲該異常。

當佇列滿時,非堵塞的put()或者put_nowait()被呼叫,將丟擲該異常。

queue物件(queue、lifoqueue或者priorityqueue)提供了下面方法:

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到佇列中。假設block是true,且timeout是none。該方法將一直等待直到有佇列有空餘空間。假設timeout是乙個正整數,該方法則最多堵塞timeout秒並丟擲full異常。假設block是false而且佇列滿,則直接丟擲full異常(這時timeout將被忽略)。

queue.put_nowait(item)

等價於put(item, false)。

queue.get(block=true, timeout=none)

從佇列中移除被返回乙個條目。假設block是true而且timeout是none,該方法將堵塞直到佇列中有條目可用。假設timeout是正整數,該方法將最多堵塞timeout秒並丟擲empty異常。假設block是false而且隊列為空。則直接丟擲empty異常(這時timeout將被忽略)。

queue.get_nowait()

等價於get(false)。

假設須要跟蹤進入佇列中的任務是否已經被精靈消費者執行緒處理完畢,能夠使用以下提供的兩個方法:

queue.task_done()

表示乙個先前的佇列中的任務完畢了。被佇列消費者執行緒使用。對於每乙個get()獲取到的任務,接下來的task_done()的呼叫告訴佇列該任務的處理已經完畢。

假設join()呼叫正在堵塞,當佇列中全部的條目被處理後它將恢復執行(意味著task_done()呼叫將被放入佇列中的每乙個條目接收到)。

假設呼叫次數超過了佇列中放置的條目數目,將丟擲valueerror異常。

queue.join()

堵塞直到佇列中全部條目都被獲取並處理。

當乙個條目被新增到佇列時,未完畢任務的計數將新增。當乙個消費者執行緒呼叫task_done()時,未完畢任務的計數將降低。

當未完畢任務的計數降低到0時,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() # 堵塞直到全部任務完畢

Python多執行緒(3) Queue模組

queue模組支援先進先出 fifo 佇列,支援多執行緒的訪問,包括乙個主要的型別 queue 和兩個異常類 exception classes python 2 中的queue模組在python 3中更名為 queue。queue物件的建立 可以通過例項化queue型別獲得佇列物件 q queue...

Python多執行緒(3) Queue模組

queue模組支援先進先出 fifo 佇列,支援多執行緒的訪問,包括乙個主要的型別 queue 和兩個異常類 exception classes python 2 中的queue模組在python 3中更名為 queue。queue物件的建立 可以通過例項化queue型別獲得佇列物件 1 q que...

Python多執行緒(3) Queue模組

queue模組支援先進先出 fifo 佇列,支援多執行緒的訪問,包括乙個主要的型別 queue 和兩個異常類 exception classes python 2 中的queue模組在python 3中更名為 queue。queue物件的建立 可以通過例項化queue型別獲得佇列物件 q queue...