Queue
Queue是python標(biāo)準(zhǔn)庫(kù)中的線(xiàn)程安全的隊(duì)列(FIFO)實(shí)現(xiàn),提供了一個(gè)適用于多線(xiàn)程編程的先進(jìn)先出的數(shù)據(jù)結(jié)構(gòu),即隊(duì)列,用來(lái)在生產(chǎn)者和消費(fèi)者線(xiàn)程之間的信息傳遞
基本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)者線(xiàn)程調(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)用線(xiàn)程,直到隊(duì)列中的所有任務(wù)被處理掉。
只要有數(shù)據(jù)被加入隊(duì)列,未完成的任務(wù)數(shù)就會(huì)增加。當(dāng)消費(fèi)者線(xiàn)程調(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://m.2667701.com/