python Queue模塊

建立一個「隊列」對象

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模塊有三種隊列:
一、python queue模塊的FIFO隊列先進先出。
二、LIFO相似於堆。即先進後出。
三、還有一種是優先級隊列級別越低越先出來。 

針對這三種隊列分別有三個構造函數:
一、class Queue.Queue(maxsize) FIFO 
二、class Queue.LifoQueue(maxsize) LIFO 
三、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() 實際上意味着等到隊列爲空,再執行別的操做

 

 

附上一個例子:python

#coding:utf-8

import Queue
import threading
import time
import random

q = Queue.Queue(0) #當有多個線程共享一個東西的時候就能夠用它了
NUM_WORKERS = 3

class MyThread(threading.Thread):

    def __init__(self,input,worktype):
       self._jobq = input
       self._work_type = worktype
       threading.Thread.__init__(self)

    def run(self):
       while True:
           if self._jobq.qsize() > 0:
               self._process_job(self._jobq.get(),self._work_type)
           else:break

    def _process_job(self, job, worktype):
       doJob(job,worktype)

def doJob(job, worktype):
   time.sleep(random.random() * 3)
    print"doing",job," worktype ",worktype

if __name__ == '__main__':
    print "begin...."
    for i inrange(NUM_WORKERS * 2):
       q.put(i) #放入到任務隊列中去
    print "job qsize:",q.qsize()

    for x inrange(NUM_WORKERS):
       MyThread(q,x).start()
一些須要注意的地方:

1. 阻塞模式dom

import Queue函數

q = Queue.Queue(10)spa

......
       for i in range(10):
               q.put('A')
               time.sleep(0.5)
線程

這是一段極其簡單的代碼(另有兩個線程也在操做隊列q),我指望每隔0.5秒寫一個'A'到隊列中,但老是不能如願:間隔時間有時會遠遠超過0.5秒。原來,Queue.put()默認有 block = True 和 timeou 兩個參數。當  block = True 時,寫入是阻塞式的,阻塞時間由 timeou  肯定。當隊列q被(其餘線程)寫滿後,這段代碼就會阻塞,直至其餘線程取走數據。Queue.put()方法加上 block=False 的參數,便可解決這個隱蔽的問題。但要注意,非阻塞方式寫隊列,當隊列滿時會拋出 exception Queue.Full 的異常。code

2. 沒法捕獲 exception Queue.Empty 的異常對象

while True:
                ......
                try:
                        data = q.get()
                except Queue.Empty:
                        break隊列

個人本意是用隊列爲空時,退出循環,但實際運行起來,卻陷入了死循環。這個問題和上面有點相似:Queue.get()默認的也是阻塞方式讀取數據,隊列爲空時,不會拋出 except Queue.Empty ,而是進入阻塞直至超時。 加上block=False 的參數,問題迎刃而解。utf-8

相關文章
相關標籤/搜索