python隊列之queue

python原生的list,dict等,都是not thread safe的。而queue,是線程安全的。Queue.Queue類即是一個隊列的同步實現。今天有個需求,典型的“生產者消費者問題”,剛好可以用到queue,挺好用。

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() 實際上意味着等到隊列爲空,再執行別的操作

這個例子很好,參考至網上

#!/bin/python
#encoding=utf-8
import threading
import time
from Queue import Queue

class Producer(threading.Thread):
    def run(self):
        global queue
        count = 0
        while True:
            for i in range(100):
                if queue.qsize() > 1000:
                     pass
                else:
                     count = count +1
                     msg = '生成產品'+str(count)
                     queue.put(msg)
                     print msg
            time.sleep(1)

class Consumer(threading.Thread):
    def run(self):
        global queue
        while True:
            for i in range(3):
                if queue.qsize() < 50:
                    pass
                else:
                    msg = self.name + '消費了 '+queue.get()
                    print msg
            time.sleep(1)

queue = Queue()

def test():
    for i in range(100):
        msg='初始產品'+str(i)
        print msg
        queue.put(msg)
    for i in range(2):
        p = Producer()
        p.start()
    for i in range(5):
        c = Consumer()
        c.start()
if __name__ == '__main__':
    test()

執行下,結果如下,自己試一下吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章