python隊(duì)列Queue
Queue
Queue是python標(biāo)準(zhǔn)庫(kù)中的線程安全的隊(duì)列(FIFO)實(shí)現(xiàn),提供了一個(gè)適用于多線程編程的先進(jìn)先出的數(shù)據(jù)結(jié)構(gòu),即隊(duì)列,用來(lái)在生產(chǎn)者和消費(fèi)者線程之間的信息傳遞
基本FIFO隊(duì)列
classQueue.Queue(maxsize=0)
FIFO即FirstinFirstOut,先進(jìn)先出。Queue提供了一個(gè)基本的FIFO容器,使用方法很簡(jiǎn)單,maxsize是個(gè)整數(shù),指明了隊(duì)列中能存放的數(shù)據(jù)個(gè)數(shù)的上限。一旦達(dá)到上限,插入會(huì)導(dǎo)致阻塞,直到隊(duì)列中的數(shù)據(jù)被消費(fèi)掉。如果maxsize小于或者等于0,隊(duì)列大小沒(méi)有限制。
舉個(gè)栗子:
importQueue
q=Queue.Queue()
foriinrange(5):
q.put(i)
whilenotq.empty():
printq.get()
輸出:
0
1
2
3
4
LIFO隊(duì)列
classQueue.LifoQueue(maxsize=0)
LIFO即LastinFirstOut,后進(jìn)先出。與棧的類(lèi)似,使用也很簡(jiǎn)單,maxsize用法同上
再舉個(gè)栗子:
importQueue
q=Queue.LifoQueue()
foriinrange(5):
q.put(i)
whilenotq.empty():
printq.get()
輸出:
4
3
2
1
0
可以看到僅僅是將Queue.Quenu類(lèi)替換為Queue.LifiQueue類(lèi)
優(yōu)先級(jí)隊(duì)列
classQueue.PriorityQueue(maxsize=0)
構(gòu)造一個(gè)優(yōu)先隊(duì)列。maxsize用法同上。
importQueue
importthreading
classJob(object):
def__init__(self,priority,description):
self.priority=priority
self.description=description
print'Job:',description
return
def__cmp__(self,other):
returncmp(self.priority,other.priority)
q=Queue.PriorityQueue()
q.put(Job(3,'level3job'))
q.put(Job(10,'level10job'))
q.put(Job(1,'level1job'))
defprocess_job(q):
whileTrue:
next_job=q.get()
print'for:',next_job.description
q.task_done()
workers=[threading.Thread(target=process_job,args=(q,)),
threading.Thread(target=process_job,args=(q,))
]
forwinworkers:
w.setDaemon(True)
w.start()
q.join()
結(jié)果
Job:level3job
Job:level10job
Job:level1job
for:level1job
for:level3job
for:job:level10job
一些常用方法
task_done()
意味著之前入隊(duì)的一個(gè)任務(wù)已經(jīng)完成。由隊(duì)列的消費(fèi)者線程調(diào)用。每一個(gè)get()調(diào)用得到一個(gè)任務(wù),接下來(lái)的task_done()調(diào)用告訴隊(duì)列該任務(wù)已經(jīng)處理完畢。
如果當(dāng)前一個(gè)join()正在阻塞,它將在隊(duì)列中的所有任務(wù)都處理完時(shí)恢復(fù)執(zhí)行(即每一個(gè)由put()調(diào)用入隊(duì)的任務(wù)都有一個(gè)對(duì)應(yīng)的task_done()調(diào)用)。
join()
阻塞調(diào)用線程,直到隊(duì)列中的所有任務(wù)被處理掉。
只要有數(shù)據(jù)被加入隊(duì)列,未完成的任務(wù)數(shù)就會(huì)增加。當(dāng)消費(fèi)者線程調(diào)用task_done()(意味著有消費(fèi)者取得任務(wù)并完成任務(wù)),未完成的任務(wù)數(shù)就會(huì)減少。當(dāng)未完成的任務(wù)數(shù)降到0,join()解除阻塞。
put(item[,block[,timeout]])
將item放入隊(duì)列中。
如果可選的參數(shù)block為T(mén)rue且timeout為空對(duì)象(默認(rèn)的情況,阻塞調(diào)用,無(wú)超時(shí))。
如果timeout是個(gè)正整數(shù),阻塞調(diào)用進(jìn)程最多timeout秒,如果一直無(wú)空空間可用,拋出Full異常(帶超時(shí)的阻塞調(diào)用)。
如果block為False,如果有空閑空間可用將數(shù)據(jù)放入隊(duì)列,否則立即拋出Full異常
其非阻塞版本為put_nowait等同于put(item,False)
get([block[,timeout]])
從隊(duì)列中移除并返回一個(gè)數(shù)據(jù)。block跟timeout參數(shù)同put方法
其非阻塞方法為get_nowait()相當(dāng)與get(False)
empty()
如果隊(duì)列為空,返回True,反之返回False
以上內(nèi)容為大家介紹了python隊(duì)列Queue,希望對(duì)大家有所幫助,如果想要了解更多Python相關(guān)知識(shí),請(qǐng)關(guān)注IT培訓(xùn)機(jī)構(gòu):千鋒教育。http://www.mobiletrain.org/

猜你喜歡LIKE
相關(guān)推薦HOT
更多>>
Python如何輸出為文件
python輸出為文件使用withopen()as語(yǔ)句。使用示例:withopen('E:\python\python\test.txt','w')asf:f.writ...詳情>>
2023-11-09 22:08:08
怎么查看python變量的類(lèi)型
python判斷變量的類(lèi)型有兩種方法:type()和isinstance()對(duì)于基本的數(shù)據(jù)類(lèi)型兩個(gè)的效果都一樣type()ip_port=['219.135.164.245',3128...詳情>>
2023-11-09 21:30:21
python如何生成文件夾
python中可以使用os.makedirs()方法創(chuàng)建多級(jí)目錄:os.makedirs()方法用于遞歸創(chuàng)建目錄。像mkdir(),但創(chuàng)建的所有intermediate-level文件夾需要包...詳情>>
2023-11-09 21:11:28
怎樣用python計(jì)算矩陣乘法?
python中計(jì)算矩陣乘法的方法:1、使用np.multiply()函數(shù)計(jì)算矩陣乘法函數(shù)作用:數(shù)組和矩陣對(duì)應(yīng)位置相乘,輸出與相乘數(shù)組/矩陣的大小一致示例:n...詳情>>
2023-11-09 20:01:23熱門(mén)推薦
python找不到指定模塊怎么辦
沸python如何將結(jié)果保存
熱python依賴(lài)安裝失敗怎么辦
熱怎么把python代碼打包
新Python如何輸出為文件
python如何檢測(cè)字符串是不是全為字母?
怎么查看python變量的類(lèi)型
python如何生成文件夾
python如何獲取程序執(zhí)行時(shí)間?
Python中猴子補(bǔ)丁是什么?
python字典打印亂碼怎么解決
怎樣用python計(jì)算矩陣乘法?
python如何調(diào)用另一個(gè)文件夾中的內(nèi)容?
python如何去空格和回車(chē)?
技術(shù)干貨







快速通道 更多>>
-
課程介紹
點(diǎn)擊獲取大綱 -
就業(yè)前景
查看就業(yè)薪資 -
學(xué)習(xí)費(fèi)用
了解課程價(jià)格 -
優(yōu)惠活動(dòng)
領(lǐng)取優(yōu)惠券 -
學(xué)習(xí)資源
領(lǐng)3000G教程 -
師資團(tuán)隊(duì)
了解師資團(tuán)隊(duì) -
實(shí)戰(zhàn)項(xiàng)目
獲取項(xiàng)目源碼 -
開(kāi)班地區(qū)
查看來(lái)校路線