Python Queue模塊詳細(xì)介紹及實(shí)例
Python Queue模塊
Python中,隊(duì)列是線程間最常用的交換數(shù)據(jù)的形式。Queue模塊是提供隊(duì)列操作的模塊,雖然簡單易用,但是不小心的話,還是會出現(xiàn)一些意外。
創(chuàng)建一個“隊(duì)列”對象
import Queue q = Queue.Queue(maxsize = 10)
Queue.Queue類即是一個隊(duì)列的同步實(shí)現(xiàn)。隊(duì)列長度可為無限或者有限??赏ㄟ^Queue的構(gòu)造函數(shù)的可選參數(shù)maxsize來設(shè)定隊(duì)列長度。如果maxsize小于1就表示隊(duì)列長度無限。
將一個值放入隊(duì)列中
q.put(10)
調(diào)用隊(duì)列對象的put()方法在隊(duì)尾插入一個項(xiàng)目。put()有兩個參數(shù),第一個item為必需的,為插入項(xiàng)目的值;第二個block為可選參數(shù),默認(rèn)為1。如果隊(duì)列當(dāng)前為空且block為1,put()方法就使調(diào)用線程暫停,直到空出一個數(shù)據(jù)單元。如果block為0,put方法將引發(fā)Full異常。
將一個值從隊(duì)列中取出
q.get()
調(diào)用隊(duì)列對象的get()方法從隊(duì)頭刪除并返回一個項(xiàng)目??蛇x參數(shù)為block,默認(rèn)為True。如果隊(duì)列為空且block為True,get()就使調(diào)用線程暫停,直至有項(xiàng)目可用。如果隊(duì)列為空且block為False,隊(duì)列將引發(fā)Empty異常。
Python Queue模塊有三種隊(duì)列及構(gòu)造函數(shù):
1、Python Queue模塊的FIFO隊(duì)列先進(jìn)先出。 class Queue.Queue(maxsize)
2、LIFO類似于堆,即先進(jìn)后出。 class Queue.LifoQueue(maxsize)
3、還有一種是優(yōu)先級隊(duì)列級別越低越先出來。 class Queue.PriorityQueue(maxsize)
此包中的常用方法(q = Queue.Queue()):
q.qsize() 返回隊(duì)列的大小 q.empty() 如果隊(duì)列為空,返回True,反之False q.full() 如果隊(duì)列滿了,返回True,反之False q.full 與 maxsize 大小對應(yīng) q.get([block[, timeout]]) 獲取隊(duì)列,timeout等待時間 q.get_nowait() 相當(dāng)q.get(False) 非阻塞 q.put(item) 寫入隊(duì)列,timeout等待時間 q.put_nowait(item) 相當(dāng)q.put(item, False) q.task_done() 在完成一項(xiàng)工作之后,q.task_done() 函數(shù)向任務(wù)已經(jīng)完成的隊(duì)列發(fā)送一個信號 q.join() 實(shí)際上意味著等到隊(duì)列為空,再執(zhí)行別的操作
范例:
實(shí)現(xiàn)一個線程不斷生成一個隨機(jī)數(shù)到一個隊(duì)列中(考慮使用Queue這個模塊)
實(shí)現(xiàn)一個線程從上面的隊(duì)列里面不斷的取出奇數(shù)
實(shí)現(xiàn)另外一個線程從上面的隊(duì)列里面不斷取出偶數(shù)
#!/usr/bin/env python #coding:utf8 import random,threading,time from Queue import Queue #Producer thread class Producer(threading.Thread): def __init__(self, t_name, queue): threading.Thread.__init__(self,name=t_name) self.data=queue def run(self): for i in range(10): #隨機(jī)產(chǎn)生10個數(shù)字 ,可以修改為任意大小 randomnum=random.randint(1,99) print "%s: %s is producing %d to the queue!" % (time.ctime(), self.getName(), randomnum) self.data.put(randomnum) #將數(shù)據(jù)依次存入隊(duì)列 time.sleep(1) print "%s: %s finished!" %(time.ctime(), self.getName()) #Consumer thread class Consumer_even(threading.Thread): def __init__(self,t_name,queue): threading.Thread.__init__(self,name=t_name) self.data=queue def run(self): while 1: try: val_even = self.data.get(1,5) #get(self, block=True, timeout=None) ,1就是阻塞等待,5是超時5秒 if val_even%2==0: print "%s: %s is consuming. %d in the queue is consumed!" % (time.ctime(),self.getName(),val_even) time.sleep(2) else: self.data.put(val_even) time.sleep(2) except: #等待輸入,超過5秒 就報異常 print "%s: %s finished!" %(time.ctime(),self.getName()) break class Consumer_odd(threading.Thread): def __init__(self,t_name,queue): threading.Thread.__init__(self, name=t_name) self.data=queue def run(self): while 1: try: val_odd = self.data.get(1,5) if val_odd%2!=0: print "%s: %s is consuming. %d in the queue is consumed!" % (time.ctime(), self.getName(), val_odd) time.sleep(2) else: self.data.put(val_odd) time.sleep(2) except: print "%s: %s finished!" % (time.ctime(), self.getName()) break #Main thread def main(): queue = Queue() producer = Producer('Pro.', queue) consumer_even = Consumer_even('Con_even.', queue) consumer_odd = Consumer_odd('Con_odd.',queue) producer.start() consumer_even.start() consumer_odd.start() producer.join() consumer_even.join() consumer_odd.join() print 'All threads terminate!' if __name__ == '__main__': main()
相關(guān)文章
Python調(diào)用SMTP服務(wù)自動發(fā)送Email的實(shí)現(xiàn)步驟
這篇文章主要介紹了Python調(diào)用SMTP服務(wù)自動發(fā)送Email的實(shí)現(xiàn)步驟,幫助大家更好的理解和使用python,感興趣的朋友可以了解下2021-02-02python解決報錯ImportError: Bad git executable.問題
這篇文章主要介紹了python解決報錯ImportError: Bad git executable.問題。具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-06-06python 畫二維、三維點(diǎn)之間的線段實(shí)現(xiàn)方法
今天小編就為大家分享一篇python 畫二維、三維點(diǎn)之間的線段實(shí)現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-07-07python中matplotlib條件背景顏色的實(shí)現(xiàn)
這篇文章主要給大家介紹了關(guān)于python中matplotlib條件背景顏色的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用python具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09Python隨機(jī)生成均勻分布在單位圓內(nèi)的點(diǎn)代碼示例
這篇文章主要介紹了Python隨機(jī)生成均勻分布在單位圓內(nèi)的點(diǎn)代碼示例,具有一定參考價值,需要的朋友可以了解下。2017-11-11