標籤:post reading 重要 分享 完數 多線程通訊 通訊 size main
生產者與消費者模式1. 隊列
先進先出
2. 棧
先進後出
Python的Queue模組中提供了同步的、安全執行緒的隊列類,包括FIFO(先入先出)隊列Queue,LIFO(後入先出)隊列LifoQueue,和優先順序隊列PriorityQueue。這些隊列都實現了鎖原語(可以理解為原子操作,即要麼不做,要麼就做完),能夠在多線程中直接使用。可以使用隊列來實現線程間的同步。
用FIFO隊列實現上述生產者與消費者問題的代碼如下:
import threadingimport timefrom queue import Queueclass Producer(threading.Thread): def run(self): global queue count = 0 while True: if queue.qsize() < 1000: for i in range(100): count = count +1 msg = ‘產生產品‘+str(count) queue.put(msg) print(msg) time.sleep(0.5)class Consumer(threading.Thread): def run(self): global queue while True: if queue.qsize() > 100: for i in range(3): msg = self.name + ‘消費了 ‘+queue.get() print(msg) time.sleep(1)if __name__ == ‘__main__‘: queue = Queue() 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()
3. Queue的說明
- 對於Queue,在多線程通訊之間扮演重要的角色
- 添加資料到隊列中,使用put()方法
- 從隊列中取資料,使用get()方法
- 判斷隊列中是否還有資料,使用qsize()方法
4. 生產者消費者模式的說明
線上程世界裡,生產者就是生產資料的線程,消費者就是消費資料的線程。在多線程開發當中,如果生產者處理速度很快,而消費者處理速度很慢,那麼生產者就必須等待消費者處理完,才能繼續生產資料。同樣的道理,如果消費者的處理能力大於生產者,那麼消費者就必須等待生產者。為瞭解決這個問題於是引入了生產者和消費者模式。
生產者消費者模式是通過一個容器來解決生產者和消費者的強耦合問題。生產者和消費者彼此之間不直接通訊,而通過阻塞隊列來進行通訊,所以生產者生產完資料之後不用等待消費者處理,直接扔給阻塞隊列,消費者不找生產者要資料,而是直接從阻塞隊列裡取,阻塞隊列就相當於一個緩衝區,平衡了生產者和消費者的處理能力。
這個阻塞隊列就是用來給生產者和消費者解耦的。縱觀大多數設計模式,都會找一個第三者出來進行解耦,
python 生產者與消費者模式