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()
執行下,結果如下,自己試一下吧。