【Python】模組之queue

G8bao7發表於2015-09-18
   Queue類即是一個佇列的同步實現。佇列長度可為無限或者有限。可透過Queue的建構函式的可選引數maxsize來設定佇列長度。如果maxsize小於1就表示佇列長度無限。
建立一個 佇列 物件 最大長度為10
from Queue import Queue
q = Queue(maxsize = 10)
 
import Queue
q = Queue.Queue(maxsize = 10)
 
python queue模組有三種佇列:
1、python queue模組的FIFO佇列先進先出。其建構函式
   class Queue.Queue(maxsize)  
2、LIFO類似於堆。即先進後出。其建構函式
   class Queue.LifoQueue(maxsize)   
3、還有一種是優先順序佇列級別越低越先出來。其建構函式 
   class Queue.PriorityQueue(maxsize)   

Queue的常用方法:
   Queue.qsize() #返回佇列的大小 
   Queue.empty() #如果佇列為空,返回True,反之False 
   Queue.full()  #如果佇列滿了,返回True,反之False
   Queue.full 與 maxsize 大小對應 
   Queue.get([block[, timeout]]) #獲取佇列,timeout等待時間,呼叫佇列物件的get()方法從隊頭刪除並返回一個專案。可選引數為block,預設為True。如果佇列為空且block為True,get()就使呼叫執行緒暫停,直至有專案可用。如果佇列為空且block為False,佇列將引發Empty異常。 
   Queue.get_nowait() #相當Queue.get(False)
   Queue.put(item)    #非阻塞寫入佇列,timeout等待時間,呼叫佇列物件的put()方法在隊尾插入一個專案。
   put()有兩個引數,第一個item為必需的,為插入專案的值;第二個block為可選引數,預設為1。如果佇列當前為空且block為1,put()方法就使呼叫執行緒暫停,直到空出一個資料單元。如果block為0,put方法將引發Full異常。
   Queue.put_nowait(item) #相當Queue.put(item, False)
   Queue.task_done()   #在完成一項工作之後,Queue.task_done() 函式向任務已經完成的佇列傳送一個訊號Queue.join() 實際上意味著等到佇列為空,再執行別的操作.

如下程式碼實現了比較經典的生產者和消費者模型:
from Queue import Queue
import random
import threading
import time

#Producer thread
class Producer(threading.Thread):
    def __init__(self, t_name, queue):
        threading.Thread.__init__(self, name=t_name)
        self.data=queue
    def run(self):
        for i in range(5):
            print "%s: %s is producing %d to the queue!" %(time.ctime(), self.getName(), i)
            self.data.put(i)
            time.sleep(random.randrange(10)/5)
        print "%s: %s finished!" %(time.ctime(), self.getName())

#Consumer thread
class Consumer(threading.Thread):
    def __init__(self, t_name, queue):
        threading.Thread.__init__(self, name=t_name)
        self.data=queue
    def run(self):
        for i in range(5):
            val = self.data.get()
            print "%s: %s is consuming. %d in the queue is consumed!" %(time.ctime(), self.getName(), val)
            time.sleep(random.randrange(10))
        print "%s: %s finished!" %(time.ctime(), self.getName())

#Main thread
def main():
    queue = Queue()
    producer = Producer('Pro.', queue)
    consumer = Consumer('Con.', queue)
    producer.start()
    consumer.start()
    producer.join()
    consumer.join()
    print 'All threads terminate!'
 
if __name__ == '__main__':
    main()

程式輸出
[root@rac1 python]# python prdcust.py   
start consumer
start producer
producing...1
producing...2
producing...3
producing...4
producing...5
5
consuming...4
consuming...3
consuming...2
consuming...1
consuming...0
0
0
參考

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26250550/viewspace-1803176/,如需轉載,請註明出處,否則將追究法律責任。

相關文章