建立一個“隊列”對象
import Queue
myqueue = Queue.Queue(maxsize = 10)
Queue.Queue類即是一個隊列的同步實現。隊列長度可為無限或者有限。可通過Queue的建構函式的選擇性參數maxsize來設定隊列長度。如果maxsize小於1就表示隊列長度無限。
將一個值放入隊列中
myqueue.put(10)
調用隊列對象的put()方法在隊尾插入一個項目。put()有兩個參數,第一個item為必需的,為插入項目的值;第二個block為選擇性參數,預設為1。如果隊列當前為空白且block為1,put()方法就使調用線程暫停,直到空出一個資料單元。如果block為0,put方法將引發Full異常。
將一個值從隊列中取出
myqueue.get()
調用隊列對象的get()方法從隊頭刪除並返回一個項目。選擇性參數為block,預設為True。如果隊列為空白且block為True,get()就使調用線程暫停,直至有項目可用。如果隊列為空白且block為False,隊列將引發Empty異常。
python queue模組有三種隊列:
1、python queue模組的FIFO隊列先進先出。
2、LIFO類似於堆。即先進後出。
3、還有一種是優先順序隊列層級越低越先出來。
針對這三種隊列分別有三個建構函式:
1、class Queue.Queue(maxsize) FIFO
2、class Queue.LifoQueue(maxsize) LIFO
3、class Queue.PriorityQueue(maxsize) 優先順序隊列
介紹一下此包中的常用方法:
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/env pythonimport Queue import threading import time import random q=Queue.Queue(0) NUM_WORKERS = 3 class MyThread(threading.Thread): """A worker thread.""" def __init__(self, input, worktype): self._jobq = input self._work_type = worktype threading.Thread.__init__(self) def run(self): """ Get a job and process it. Stop when there's no more jobs """ while True: if self._jobq.qsize()>0: job = self._jobq.get() worktype=self._work_type self._process_job(job,worktype) else: break def _process_job(self, job,worktype): """ Do useful work here. worktype: let this thread do different work 1,do list 2,do item 3,,, """ doJob(job) def doJob(job): """ do work function 1 """ time.sleep(random.random()*3) print "doing ",job if __name__=='__main__': print "begin..." #put some work to q for i in range(NUM_WORKERS*2): q.put(i) #print total job q's size print "job q'size",q.qsize() #start threads to work for x in range(NUM_WORKERS): MyThread(q,x).start() #if q is not empty, wait #while q.qsize()>0: # time.sleep(0.1)