前面了解了一下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()
測試圖如下: