前面瞭解了一下threading,發現通常都是和queue模塊配合使用的,queue產生一個隊列,隊列模式有3種,針對這三種隊列分別有三個構造函數:python
1 FIFO隊列先進先出:class Queue.Queue(maxsize)函數
2 LIFO相似於堆,即先進後出:class Queue.LifoQueue(maxsize) 測試
3 優先級隊列級別越低越先出來:class Queue.PriorityQueue(maxsize)spa
隊列長度可爲無限或者有限。可經過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() 就會結束阻塞狀態。
.net
隊列實例分別有如下操做方法: 線程
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() 實際上意味着等到隊列爲空,再執行別的操做
code
下面是一個生產者消費者模型,抄的改改代碼就能夠用了,主要是瞭解過程。 對象
#!/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()
測試圖以下:隊列