Python多线程3:queue
queue模塊實(shí)現(xiàn)了多生產(chǎn)者。多消費(fèi)者隊(duì)列。在多線程環(huán)境下,該隊(duì)列能實(shí)現(xiàn)多個(gè)線程間安全的信息交換。
queue模塊介紹
模塊實(shí)現(xiàn)了3種類型的隊(duì)列,差別在于隊(duì)列中條目檢索的順序不同。在FIFO隊(duì)列中。依照先進(jìn)先出的順序檢索條目。在LIFO隊(duì)列中,最后加入的條目最先檢索到(操作類似一個(gè)棧)。在優(yōu)先級(jí)隊(duì)列中,條目被保存為有序的(使用heapq模塊)而且最小值的條目被最先檢索。
queue模塊定義了以下的類和異常:
class queue.Queue(maxsize=0)
FIFO隊(duì)列的構(gòu)造器。maxsize為一個(gè)整數(shù)。表示隊(duì)列的最大條目數(shù)。一旦隊(duì)列滿,插入將被堵塞直到隊(duì)列中存在空暇空間。假設(shè)maxsize小于等于0。隊(duì)列大小為無(wú)限。class queue.LifoQueue(maxsize=0)
LIFO隊(duì)列的構(gòu)造器。maxsize是一個(gè)整數(shù),表示隊(duì)列的最大條目數(shù)。一旦隊(duì)列滿,插入將被堵塞直到隊(duì)列中存在空暇空間。假設(shè)maxsize小于等于0,隊(duì)列大小為無(wú)限。
class queue.PriorityQueue(maxsize=0)
優(yōu)先級(jí)隊(duì)列的構(gòu)造器。maxsize是一個(gè)整數(shù),表示隊(duì)列的最大條目數(shù)。一旦隊(duì)列滿,插入將被堵塞直到隊(duì)列中存在空暇空間。假設(shè)maxsize小于等于0,隊(duì)列大小為無(wú)限。
最小值的條目被最先檢索到(最小值的條目即為被sorted(list(entries))[0]返回的條目)。
通常一個(gè)條目被保存為以下的形式:(priority_number, data)。
exception queue.Empty
當(dāng)Queue為空時(shí),非堵塞的get()或者get_nowait()被調(diào)用時(shí),將拋出該異常。exception queue.Full
當(dāng)隊(duì)列滿時(shí),非堵塞的put()或者put_nowait()被調(diào)用,將拋出該異常。Queue對(duì)象
Queue對(duì)象(Queue、LifoQueue或者PriorityQueue)提供了下面方法:Queue.qsize()
返回隊(duì)列的近似大小。注意,qsize() > 0并不能保證接下來(lái)的get()方法不被堵塞。相同。qsize() < maxsize也不能保證put()將不被堵塞。
Queue.empty()
假設(shè)隊(duì)列是空的。則返回True,否則False。假設(shè)empty()返回True,并不能保證接下來(lái)的put()調(diào)用將不被堵塞。類似的。empty()返回False也不能保證接下來(lái)的get()調(diào)用將不被堵塞。
Queue.full()
假設(shè)隊(duì)列滿則返回True,否則返回False。假設(shè)full()返回True,并不能保證接下來(lái)的get()調(diào)用將不被堵塞。
類似的,full()返回False也不能保證接下來(lái)的put()調(diào)用將不被堵塞。
Queue.put(item, block=True, timeout=None)
放item到隊(duì)列中。假設(shè)block是True,且timeout是None。該方法將一直等待直到有隊(duì)列有空余空間。假設(shè)timeout是一個(gè)正整數(shù),該方法則最多堵塞timeout秒并拋出Full異常。假設(shè)block是False而且隊(duì)列滿,則直接拋出Full異常(這時(shí)timeout將被忽略)。
Queue.put_nowait(item)
等價(jià)于put(item, False)。
Queue.get(block=True, timeout=None)
從隊(duì)列中移除被返回一個(gè)條目。假設(shè)block是True而且timeout是None,該方法將堵塞直到隊(duì)列中有條目可用。假設(shè)timeout是正整數(shù),該方法將最多堵塞timeout秒并拋出Empty異常。假設(shè)block是False而且隊(duì)列為空。則直接拋出Empty異常(這時(shí)timeout將被忽略)。
Queue.get_nowait()
等價(jià)于get(False)。
假設(shè)須要跟蹤進(jìn)入隊(duì)列中的任務(wù)是否已經(jīng)被精靈消費(fèi)者線程處理完畢,能夠使用以下提供的兩個(gè)方法:
Queue.task_done()
表示一個(gè)先前的隊(duì)列中的任務(wù)完畢了。被隊(duì)列消費(fèi)者線程使用。對(duì)于每一個(gè)get()獲取到的任務(wù),接下來(lái)的task_done()的調(diào)用告訴隊(duì)列該任務(wù)的處理已經(jīng)完畢。
假設(shè)join()調(diào)用正在堵塞,當(dāng)隊(duì)列中全部的條目被處理后它將恢復(fù)運(yùn)行(意味著task_done()調(diào)用將被放入隊(duì)列中的每一個(gè)條目接收到)。
假設(shè)調(diào)用次數(shù)超過了隊(duì)列中放置的條目數(shù)目,將拋出ValueError異常。
Queue.join()
堵塞直到隊(duì)列中全部條目都被獲取并處理。
當(dāng)一個(gè)條目被添加到隊(duì)列時(shí),未完畢任務(wù)的計(jì)數(shù)將添加。當(dāng)一個(gè)消費(fèi)者線程調(diào)用task_done()時(shí),未完畢任務(wù)的計(jì)數(shù)將降低。
當(dāng)未完畢任務(wù)的計(jì)數(shù)降低到0時(shí),join()解鎖。
以下是一個(gè)詳細(xì)的樣例。用于說明怎么等待隊(duì)列任務(wù)完畢:
轉(zhuǎn)載于:https://www.cnblogs.com/jzdwajue/p/7028909.html
總結(jié)
以上是生活随笔為你收集整理的Python多线程3:queue的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 恒丰银行信用卡客服电话是多少?怎么转人工
- 下一篇: 概率分布之间的距离度量以及python实