(2018-04-10.Python從Zero到One)二、python高級編程__2.2.10生產者與消費者模式

上一篇文章為:→2.2.9同步應用

生產者與消費者模式

1. 隊列

先進先出

day15_線程-01.jpg

2. 棧

先進后出

day15_線程-02.jpeg

Python的Queue模塊中提供了同步的、線程安全的隊列類,包括FIFO(先入先出)隊列Queue,LIFO(后入先出)隊列LifoQueue,和優先級隊列PriorityQueue。這些隊列都實現了鎖原語(可以理解為原子操作,即要么不做,要么就做完),能夠在多線程中直接使用。可以使用隊列來實現線程間的同步。

用FIFO隊列實現上述生產者與消費者問題的代碼如下:

#encoding=utf-8
import threading
import time

#python2中
from Queue import Queue

#python3中
# from queue import Queue

class 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的說明

  1. 對于Queue,在多線程通信之間扮演重要的角色
  2. 添加數據到隊列中,使用put()方法
  3. 從隊列中取數據,使用get()方法
  4. 判斷隊列中是否還有數據,使用qsize()方法

4. 生產者消費者模式的說明

  • 為什么要使用生產者和消費者模式

在線程世界里,生產者就是生產數據的線程,消費者就是消費數據的線程。在多線程開發當中,如果生產者處理速度很快,而消費者處理速度很慢,那么生產者就必須等待消費者處理完,才能繼續生產數據。同樣的道理,如果消費者的處理能力大于生產者,那么消費者就必須等待生產者。為了解決這個問題于是引入了生產者和消費者模式。

  • 什么是生產者消費者模式

生產者消費者模式是通過一個容器來解決生產者和消費者的強耦合問題。生產者和消費者彼此之間不直接通訊,而通過阻塞隊列來進行通訊,所以生產者生產完數據之后不用等待消費者處理,直接扔給阻塞隊列,消費者不找生產者要數據,而是直接從阻塞隊列里取,阻塞隊列就相當于一個緩沖區,平衡了生產者和消費者的處理能力。

這個阻塞隊列就是用來給生產者和消費者解耦的。縱觀大多數設計模式,都會找一個第三者出來進行解耦,


下一篇文章為:→2.2.11ThreadLocal
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,836評論 18 139
  • 生產者消費者模式介紹 生產者消費者模式是通過一個容器來解決生產者和消費者的強耦合問題。生產者和消費者彼此之間不直接...
    monkey01閱讀 4,386評論 0 13
  • 幽暗的小小樹林里,飄香的茉莉樹蔭下,高高的蘆葦叢當中,流動著銀白的小溪,微風輕拂著小溪的流水,波浪泛起珍珠般的泡沫...
    賴床的螢火蟲閱讀 263評論 0 1
  • 刀劍雖利,可以用來殺人,也可以用來保護所愛之人。當我拿著刀劍時便不能擁抱你,放下刀劍又不能保護你,到底應該相濡...
    刀口吟詩閱讀 237評論 0 1
  • 2017-3-1 晴 你是否列過目標但總也無法達成? 你是否寫過計劃但從沒按計劃執行過? 這樣的事過去曾不止一次...
    實干作品閱讀 178評論 0 0