隊(duì)列:只允許在一端進(jìn)行插入操作,在另一端進(jìn)行刪除操作的線性表。原理運(yùn)作為先進(jìn)先出
創(chuàng)新互聯(lián)是一家朝氣蓬勃的網(wǎng)站建設(shè)公司。公司專注于為企業(yè)提供信息化建設(shè)解決方案。從事網(wǎng)站開發(fā),網(wǎng)站制作,網(wǎng)站設(shè)計(jì),網(wǎng)站模板,微信公眾號(hào)開發(fā),軟件開發(fā),微信平臺(tái)小程序開發(fā),十余年建站對(duì)成都PVC花箱等多個(gè)方面,擁有豐富的網(wǎng)站推廣經(jīng)驗(yàn)。
雙端隊(duì)列:具有隊(duì)列和棧的屬性的結(jié)構(gòu),元素可以從兩端彈出,其限定插入和刪除操作在表的兩端進(jìn)行,雙端隊(duì)列可以在隊(duì)列任意一端入隊(duì)和出隊(duì)
is_empty和size方法普通的隊(duì)列相同
Queue 叫隊(duì)列,是數(shù)據(jù)結(jié)構(gòu)中的一種,基本上所有成熟的編程語(yǔ)言都內(nèi)置了對(duì) Queue 的支持。
Python 中的 Queue 模塊實(shí)現(xiàn)了多生產(chǎn)者和多消費(fèi)者模型,當(dāng)需要在多線程編程中非常實(shí)用。而且該模塊中的 Queue 類實(shí)現(xiàn)了鎖原語(yǔ),不需要再考慮多線程安全問題。
該模塊內(nèi)置了三種類型的 Queue,分別是 class queue.Queue(maxsize=0) , class queue.LifoQueue(maxsize=0) 和 class queue.PriorityQueue(maxsize=0) 。它們?nèi)齻€(gè)的區(qū)別僅僅是取出時(shí)的順序不一致而已。
Queue 是一個(gè) FIFO 隊(duì)列,任務(wù)按照添加的順序被取出。
LifoQueue 是一個(gè) LIFO 隊(duì)列,類似堆棧,后添加的任務(wù)先被取出。
PriorityQueue 是一個(gè)優(yōu)先級(jí)隊(duì)列,隊(duì)列里面的任務(wù)按照優(yōu)先級(jí)排序,優(yōu)先級(jí)高的先被取出。
如你所見,就是上面所說的三種不同類型的內(nèi)置隊(duì)列,其中 maxsize 是個(gè)整數(shù),用于設(shè)置可以放入隊(duì)列中的任務(wù)數(shù)的上限。當(dāng)達(dá)到這個(gè)大小的時(shí)候,插入操作將阻塞至隊(duì)列中的任務(wù)被消費(fèi)掉。如果 maxsize 小于等于零,則隊(duì)列尺寸為無限大。
向隊(duì)列中添加任務(wù),直接調(diào)用 put() 函數(shù)即可
put() 函數(shù)完整的函數(shù)簽名如下 Queue.put(item, block=True, timeout=None) ,如你所見,該函數(shù)有兩個(gè)可選參數(shù)。
默認(rèn)情況下,在隊(duì)列滿時(shí),該函數(shù)會(huì)一直阻塞,直到隊(duì)列中有空余的位置可以添加任務(wù)為止。如果 timeout 是正數(shù),則最多阻塞 timeout 秒,如果這段時(shí)間內(nèi)還沒有空余的位置出來,則會(huì)引發(fā) Full 異常。
當(dāng) block 為 false 時(shí),timeout 參數(shù)將失效。同時(shí)如果隊(duì)列中沒有空余的位置可添加任務(wù)則會(huì)引發(fā) Full 異常,否則會(huì)直接把任務(wù)放入隊(duì)列并返回,不會(huì)阻塞。
另外,還可以通過 Queue.put_nowait(item) 來添加任務(wù),相當(dāng)于 Queue.put(item, False) ,不再贅述。同樣,在隊(duì)列滿時(shí),該操作會(huì)引發(fā) Full 異常。
從隊(duì)列中獲取任務(wù),直接調(diào)用 get() 函數(shù)即可。
與 put() 函數(shù)一樣, get() 函數(shù)也有兩個(gè)可選參數(shù),完整簽名如下 Queue.get(block=True, timeout=None) 。
默認(rèn)情況下,當(dāng)隊(duì)列空時(shí)調(diào)用該函數(shù)會(huì)一直阻塞,直到隊(duì)列中有任務(wù)可獲取為止。如果 timeout 是正數(shù),則最多阻塞 timeout 秒,如果這段時(shí)間內(nèi)還沒有任務(wù)可獲取,則會(huì)引發(fā) Empty 異常。
當(dāng) block 為 false 時(shí),timeout 參數(shù)將失效。同時(shí)如果隊(duì)列中沒有任務(wù)可獲取則會(huì)立刻引發(fā) Empty 異常,否則會(huì)直接獲取一個(gè)任務(wù)并返回,不會(huì)阻塞。
另外,還可以通過 Queue.get_nowait() 來獲取任務(wù),相當(dāng)于 Queue.get(False) ,不再贅述。同樣,在隊(duì)列為空時(shí),該操作會(huì)引發(fā) Empty 異常。
Queue.qsize() 函數(shù)返回隊(duì)列的大小。注意這個(gè)大小不是精確的,qsize() 0 不保證后續(xù)的 get() 不被阻塞,同樣 qsize() maxsize 也不保證 put() 不被阻塞。
如果隊(duì)列為空,返回 True ,否則返回 False 。如果 empty() 返回 True ,不保證后續(xù)調(diào)用的 put() 不被阻塞。類似的,如果 empty() 返回 False ,也不保證后續(xù)調(diào)用的 get() 不被阻塞。
如果隊(duì)列是滿的返回 True ,否則返回 False 。如果 full() 返回 True 不保證后續(xù)調(diào)用的 get() 不被阻塞。類似的,如果 full() 返回 False 也不保證后續(xù)調(diào)用的 put() 不被阻塞。
queue.Queue() 是 FIFO 隊(duì)列,出隊(duì)順序跟入隊(duì)順序是一致的。
queue.LifoQueue() 是 LIFO 隊(duì)列,出隊(duì)順序跟入隊(duì)順序是完全相反的,類似于棧。
優(yōu)先級(jí)隊(duì)列中的任務(wù)順序跟放入時(shí)的順序是無關(guān)的,而是按照任務(wù)的大小來排序,最小值先被取出。那任務(wù)比較大小的規(guī)則是怎么樣的呢。
注意,因?yàn)榱斜淼谋容^對(duì)規(guī)則是按照下標(biāo)順序來比較的,所以在沒有比較出大小之前 ,隊(duì)列中所有列表對(duì)應(yīng)下標(biāo)位置的元素類型要一致。
好比 [2,1] 和 ["1","b"] 因?yàn)榈谝粋€(gè)位置的元素類型不一樣,所以是沒有辦法比較大小的,所以也就放入不了優(yōu)先級(jí)隊(duì)列。
然而對(duì)于 [2,1] 和 [1,"b"] 來說即使第二個(gè)元素的類型不一致也是可以放入優(yōu)先級(jí)隊(duì)列的,因?yàn)橹恍枰容^第一個(gè)位置元素的大小就可以比較出結(jié)果了,就不需要比較第二個(gè)位置元素的大小了。
但是對(duì)于 [2,1] 和 1 [2,"b"] 來說,則同樣不可以放入優(yōu)先級(jí)隊(duì)列,因?yàn)樾枰容^第二個(gè)位置的元素才可以比較出結(jié)果,然而第二個(gè)位置的元素類型是不一致的,無法比較大小。
綜上,也就是說, 直到在比較出結(jié)果之前,對(duì)應(yīng)下標(biāo)位置的元素類型都是需要一致的 。
下面我們自定義一個(gè)動(dòng)物類型,希望按照年齡大小來做優(yōu)先級(jí)排序。年齡越小優(yōu)先級(jí)越高。
本章節(jié)介紹了隊(duì)列以及其常用操作。因?yàn)殛?duì)列默認(rèn)實(shí)現(xiàn)了鎖原語(yǔ),因此在多線程編程中就不需要再考慮多線程安全問題了,對(duì)于程序員來說相當(dāng)友好了。
1.隊(duì)列是先進(jìn)先出,列表可以讀取某個(gè)指定數(shù)據(jù)
2.隊(duì)列如果將儲(chǔ)存的數(shù)據(jù)都讀完就結(jié)束,列表可以反復(fù)讀取
例如:
二、具體介紹一下queue
在使用queue的時(shí)候要先引入queue模塊,創(chuàng)建對(duì)象~
其中queue可以創(chuàng)建出三種對(duì)象分別是
1.先進(jìn)先出行Queue(maxsize = ?)
通過上面的例子我們能發(fā)現(xiàn),put 方法是往隊(duì)列放數(shù)據(jù),但是隊(duì)列跟列表不同取完之后數(shù)據(jù)就沒有了,如果取的數(shù)據(jù)大于列表存放的數(shù)據(jù)就會(huì)卡住這時(shí)候有兩種解決辦法,第一種調(diào)用get_nowait()方法,這時(shí)候就會(huì)報(bào)異常queue.Empty,第二種就是從get自身解決,get(block = False),默認(rèn)的時(shí)候block是True。
2.后進(jìn)先出LifeQueue()是個(gè)縮寫是Last in first out
3.priorityQueue可以理解成vip,看你的心情讓那先出就先出
三、利用queue和多線程寫一個(gè)生產(chǎn)者消費(fèi)者
本文標(biāo)題:python函數(shù)隊(duì)列 隊(duì)列Python
網(wǎng)站網(wǎng)址:http://m.kartarina.com/article48/hgpdep.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營(yíng)銷推廣、靜態(tài)網(wǎng)站、云服務(wù)器、建站公司、域名注冊(cè)、微信小程序
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)