Python2.7 Queue模塊學習


 前面了解了一下threading,發現一般都是和queue模塊配合使用的,queue產生一個隊列,隊列模式有3種,針對這三種隊列分別有三個構造函數:

    1 FIFO隊列先進先出:class Queue.Queue(maxsize)

    2 LIFO類似於堆,即先進后出:class Queue.LifoQueue(maxsize) 

    3 優先級隊列級別越低越先出來:class Queue.PriorityQueue(maxsize)

    隊列長度可為無限或者有限。可通過Queue的構造函數的可選參數maxsize來設定隊列長度。如果maxsize小於1就表示隊列長度無限。調用隊列對象的put()方法在隊尾插入一個項目。put()有兩個參數,第一個item為必需的,為插入項目的值;第二個block為可選參數, 默認為1。如果隊列當前為空且block為1,put()方法就使調用線程暫停,直到空出一個數據單元。如果block為0,put方法將引發Full異常。調用隊列對象的get()方法從隊頭刪除並返回一個項目。可選參數為block,默認為1。如果隊列為空且block為1,get()就使調用線程暫停,直至有項目可用。如果block為0,隊列將引發Empty異常。join()保持阻塞狀態,直到處理了隊列中的所有項目為止。在將一個項目添加到該隊列時,未完成的任務的總數就會增加。當使用者線程調用task_done()以表示檢索了該項目、並完成了所有的工作時,那么未完成的任務的總數就會減少。當未完成的任務的總數減少到零時,join() 就會結束阻塞狀態。

 

 

   隊列實例分別有以下操作方法:

    Queue.qsize() 返回隊列的大小  
    Queue.empty() 如果隊列為空,返回True,反之False  
    Queue.full() 如果隊列滿了,返回True,反之False 
    Queue.full 與 maxsize 大小對應  
    Queue.get([block[, timeout]]) 獲取隊列,timeout等待時間  
    Queue.get_nowait() 相當Queue.get(False) 
    Queue.put(item) 寫入隊列,timeout等待時間  
    Queue.put_nowait(item) 相當Queue.put(item, False) 
    Queue.task_done() 在完成一項工作之后,Queue.task_done() 函數向任務已經完成的隊列發送一個信號 
    Queue.join() 實際上意味着等到隊列為空,再執行別的操作

下面是一個生產者消費者模型,抄的改改代碼就可以用了,主要是了解過程。

#!/usr/bin/python
import Queue
import time import threading q=Queue.Queue() class producer(threading.Thread): def __init__(self,i): threading.Thread.__init__(self,name="producer Thread-%d" % i) def run(self): global q count=9 while True: for i in range(3): if q.qsize() > 12: pass else: count=count+1 msg=str(count) q.put(msg) print self.name+' '+'producer'+msg+' '+'Queue Size:'+str(q.qsize()) time.sleep(2) class consumer(threading.Thread): def __init__(self,i): threading.Thread.__init__(self,name="consumer Thread-%d" % i) def run(self): global q while True: for i in range(3): if q.qsize() < 1: pass else: msg=q.get() print self.name+' '+'consumer'+msg+' '+'Queue Size:'+str(q.qsize()) time.sleep(2) def test(): for i in range(10): q.put(str(i)) print 'Init producer '+str(i) for i in range(2): p=producer(i) p.start() for i in range(3): c=consumer(i) c.start() if __name__ == '__main__': test()

測試圖如下:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM