當多個線程須要共享數據或者資源的時候,可能會使得線程的使用變得複雜。線程模塊提供了許多同步原語,包括信號量、條件變量、事件和鎖。當這些選項存在時,最佳實踐是轉而關注於使用隊列。相比較而言,隊列更容易處理,而且可使得線程編程更加安全,由於它們可以有效地傳送單個線程對資源的全部訪問,並支持更加清晰的、可讀性更強的設計模式。 python
Python的Queue模塊中提供了同步的、線程安全的隊列類,包括FIFO(先入先出)隊列Queue,LIFO(後入先出)隊列LifoQueue,和優先級隊列PriorityQueue。這些隊列都實現了鎖原語,可以在多線程中直接使用。可使用隊列來實現線程間的同步。 編程
用FIFO隊列實現上述生產者與消費者問題的代碼以下: 設計模式
#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() < 100: pass else: msg = self.name + '消費了 '+queue.get() print msg time.sleep(1) queue = Queue() def test(): for i in range(500): queue.put('初始產品'+str(i)) for i in range(2): p = Producer() p.start() for i in range(5): c = Consumer() c.start() if __name__ == '__main__': test()