日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python多线程3:queue

發(fā)布時間:2023/12/13 python 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python多线程3:queue 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

queue模塊實現(xiàn)了多生產者。多消費者隊列。在多線程環(huán)境下,該隊列能實現(xiàn)多個線程間安全的信息交換。

queue模塊介紹

模塊實現(xiàn)了3種類型的隊列,差別在于隊列中條目檢索的順序不同。

在FIFO隊列中。依照先進先出的順序檢索條目。在LIFO隊列中,最后加入的條目最先檢索到(操作類似一個棧)。在優(yōu)先級隊列中,條目被保存為有序的(使用heapq模塊)而且最小值的條目被最先檢索。


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

class queue.Queue(maxsize=0)

FIFO隊列的構造器。maxsize為一個整數(shù)。表示隊列的最大條目數(shù)。一旦隊列滿,插入將被堵塞直到隊列中存在空暇空間。假設maxsize小于等于0。隊列大小為無限。


class queue.LifoQueue(maxsize=0)

LIFO隊列的構造器。

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


class queue.PriorityQueue(maxsize=0)

優(yōu)先級隊列的構造器。maxsize是一個整數(shù),表示隊列的最大條目數(shù)。一旦隊列滿,插入將被堵塞直到隊列中存在空暇空間。

假設maxsize小于等于0,隊列大小為無限。


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

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

exception queue.Empty

當Queue為空時,非堵塞的get()或者get_nowait()被調用時,將拋出該異常。


exception queue.Full

當隊列滿時,非堵塞的put()或者put_nowait()被調用,將拋出該異常。

Queue對象

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是一個正整數(shù),該方法則最多堵塞timeout秒并拋出Full異常。假設block是False而且隊列滿,則直接拋出Full異常(這時timeout將被忽略)。



Queue.put_nowait(item)
等價于put(item, False)。

Queue.get(block=True, timeout=None)
從隊列中移除被返回一個條目。假設block是True而且timeout是None,該方法將堵塞直到隊列中有條目可用。假設timeout是正整數(shù),該方法將最多堵塞timeout秒并拋出Empty異常。假設block是False而且隊列為空。則直接拋出Empty異常(這時timeout將被忽略)。



Queue.get_nowait()
等價于get(False)。

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


Queue.task_done()
表示一個先前的隊列中的任務完畢了。被隊列消費者線程使用。對于每一個get()獲取到的任務,接下來的task_done()的調用告訴隊列該任務的處理已經完畢。


假設join()調用正在堵塞,當隊列中全部的條目被處理后它將恢復運行(意味著task_done()調用將被放入隊列中的每一個條目接收到)。


假設調用次數(shù)超過了隊列中放置的條目數(shù)目,將拋出ValueError異常。

Queue.join()
堵塞直到隊列中全部條目都被獲取并處理。
當一個條目被添加到隊列時,未完畢任務的計數(shù)將添加。當一個消費者線程調用task_done()時,未完畢任務的計數(shù)將降低。

當未完畢任務的計數(shù)降低到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 = Truet.start()for item in source():q.put(item)q.join() # 堵塞直到全部任務完畢

轉載于:https://www.cnblogs.com/jzdwajue/p/7028909.html

總結

以上是生活随笔為你收集整理的Python多线程3:queue的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。