• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
    問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
    當前位置: 首頁 - 科技 - 知識百科 - 正文

    理解生產者消費者模型及在Python編程中的運用實例

    來源:懂視網 責編:小采 時間:2020-11-27 14:29:08
    文檔

    理解生產者消費者模型及在Python編程中的運用實例

    理解生產者消費者模型及在Python編程中的運用實例:什么是生產者消費者模型 在 工作中,大家可能會碰到這樣一種情況:某個模塊負責產生數據,這些數據由另一個模塊來負責處理(此處的模塊是廣義的,可以是類、函數、線程、進程等)。產 生數據的模塊,就形象地稱為生產者;而處理數據的模塊,就稱為消費者。在
    推薦度:
    導讀理解生產者消費者模型及在Python編程中的運用實例:什么是生產者消費者模型 在 工作中,大家可能會碰到這樣一種情況:某個模塊負責產生數據,這些數據由另一個模塊來負責處理(此處的模塊是廣義的,可以是類、函數、線程、進程等)。產 生數據的模塊,就形象地稱為生產者;而處理數據的模塊,就稱為消費者。在
    什么是生產者消費者模型

    在 工作中,大家可能會碰到這樣一種情況:某個模塊負責產生數據,這些數據由另一個模塊來負責處理(此處的模塊是廣義的,可以是類、函數、線程、進程等)。產 生數據的模塊,就形象地稱為生產者;而處理數據的模塊,就稱為消費者。在生產者與消費者之間在加個緩沖區,我們形象的稱之為倉庫,生產者負責往倉庫了進商 品,而消費者負責從倉庫里拿商品,這就構成了生產者消費者模型。結構圖如下:

    2016626144908200.jpg (401×74)

    生產者消費者模型的優點:

    1、解耦

    假設生產者和消費者分別是兩個類。如果讓生產者直接調用消費者的某個方法,那么生產者對于消費者就會產生依賴(也就是耦合)。將來如果消費者的代碼發生變化, 可能會影響到生產者。而如果兩者都依賴于某個緩沖區,兩者之間不直接依賴,耦合也就相應降低了。

    舉個例子,我們去郵局投遞信件,如果不使用郵筒(也就是緩沖區),你必須得把信直接交給郵遞員。有同學會說,直接給郵遞員不是挺簡單的嘛?其實不簡單,你必須 得認識誰是郵遞員,才能把信給他(光憑身上穿的制服,萬一有人假冒,就慘了)。這就產生和你和郵遞員之間的依賴(相當于生產者和消費者的強耦合)。萬一哪天郵遞員換人了,你還要重新認識一下(相當于消費者變化導致修改生產者代碼)。而郵筒相對來說比較固定,你依賴它的成本就比較低(相當于和緩沖區之間的弱耦合)。

    2、支持并發

    由于生產者與消費者是兩個獨立的并發體,他們之間是用緩沖區作為橋梁連接,生產者只需要往緩沖區里丟數據,就可以繼續生產下一個數據,而消費者只需要從緩沖區了拿數據即可,這樣就不會因為彼此的處理速度而發生阻塞。

    接上面的例子,如果我們不使用郵筒,我們就得在郵局等郵遞員,直到他回來,我們把信件交給他,這期間我們啥事兒都不能干(也就是生產者阻塞),或者郵遞員得挨家挨戶問,誰要寄信(相當于消費者輪詢)。

    3、支持忙閑不均

    緩沖區還有另一個好處。如果制造數據的速度時快時慢,緩沖區的好處就體現出來了。當數據制造快的時候,消費者來不及處理,未處理的數據可以暫時存在緩沖區中。 等生產者的制造速度慢下來,消費者再慢慢處理掉。

    為了充分復用,我們再拿寄信的例子來說事。假設郵遞員一次只能帶走1000封信。萬一某次碰上情人節(也可能是圣誕節)送賀卡,需要寄出去的信超過1000封,這時 候郵筒這個緩沖區就派上用場了。郵遞員把來不及帶走的信暫存在郵筒中,等下次過來 時再拿走。

    Python示例:
    利用隊列實現簡單的生產者消費者模型,生產者產生時間放入隊列,消費者取出時間打印

    class Consumer(threading.Thread):
     def __init__(self, queue):
     threading.Thread.__init__(self)
     self._queue = queue
    
     def run(self):
     while True:
     msg = self._queue.get()
     if isinstance(msg, str) and msg == 'quit':
     break
     print "I'm a thread, and I received %s!!" % msg
     print 'Bye byes!'
    
    
    def producer():
     queue = Queue.Queue()
     worker = Consumer(queue)
     worker.start() # 開啟消費者線程
     start_time = time.time()
     while time.time() - start_time < 5:
     queue.put('something at %s' % time.time())
     time.sleep(1)
     queue.put('quit')
     worker.join()
    
    
    if __name__ == '__main__':
     producer()
    
    


    使用多線程,在做爬蟲的時候,生產者用著產生url鏈接,消費者用于獲取url數據,在隊列的幫助下可以使用多線程加快爬蟲速度。

    import time
    import threading
    import Queue
    import urllib2
    
    class Consumer(threading.Thread):
     def __init__(self, queue):
     threading.Thread.__init__(self)
     self._queue = queue
    
     def run(self):
     while True:
     content = self._queue.get()
     print content
     if isinstance(content, str) and content == 'quit':
     break
     response = urllib2.urlopen(content)
     print 'Bye byes!'
    
    
    def Producer():
     urls = [
     'http://211.103.242.133:8080/Disease/Details.aspx?id=2258',
     'http://211.103.242.133:8080/Disease/Details.aspx?id=2258',
     'http://211.103.242.133:8080/Disease/Details.aspx?id=2258',
     'http://211.103.242.133:8080/Disease/Details.aspx?id=2258'
     ]
     queue = Queue.Queue()
     worker_threads = build_worker_pool(queue, 4)
     start_time = time.time()
     for url in urls:
     queue.put(url)
    
     for worker in worker_threads:
     queue.put('quit')
     for worker in worker_threads:
     worker.join()
    
     print 'Done! Time taken: {}'.format(time.time() - start_time)
    
    
    def build_worker_pool(queue, size):
     workers = []
     for _ in range(size):
     worker = Consumer(queue)
     worker.start()
     workers.append(worker)
     return workers
    
    if __name__ == '__main__':
     Producer()
    
    

    聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    理解生產者消費者模型及在Python編程中的運用實例

    理解生產者消費者模型及在Python編程中的運用實例:什么是生產者消費者模型 在 工作中,大家可能會碰到這樣一種情況:某個模塊負責產生數據,這些數據由另一個模塊來負責處理(此處的模塊是廣義的,可以是類、函數、線程、進程等)。產 生數據的模塊,就形象地稱為生產者;而處理數據的模塊,就稱為消費者。在
    推薦度:
    標簽: 例子 及應用 示例
    • 熱門焦點

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 91精品国产高清91久久久久久 | 国产精品爽黄69天堂a| 国产精品日韩欧美久久综合 | 亚洲国产小视频精品久久久三级| 欧美激情精品久久久久| 久久国产精品成人影院| 国产亚洲精品自在线观看| 国产精品九九九久久九九| 亚洲欧美日韩久久精品第一区| 国产精品无码免费专区午夜| 欧美亚洲国产精品久久蜜芽| 99re这里只有精品国产精品| 精品久久久久久成人AV| 亚洲AV永久无码精品水牛影视| 精品乱子伦一区二区三区高清免费播放| 欧美亚洲国产成人精品| 精品精品国产自在久久高清| 国产精品内射后入合集| 久久精品无码专区免费青青 | 精品国产不卡一区二区三区 | 久久精品国产99久久香蕉| 国产成人精品a视频一区| 久久精品免费观看| 97精品国产高清自在线看超| 西瓜精品国产自在现线| 99久久精品免费看国产免费| 久久最新精品国产| 精品一区二区三区在线视频| 99国产精品一区二区| 国产精品久久久久久吹潮| 奇米精品视频一区二区三区| 亚洲动漫精品无码av天堂| 亚洲欧洲美洲无码精品VA| 真实国产乱子伦精品视频| 亚洲日韩国产精品乱| 亚洲国产欧美日韩精品一区二区三区| 青草青草久热精品视频在线观看| 久久er国产精品免费观看8| 国产在线精品国自产拍影院| 国产亚洲精品无码拍拍拍色欲| 国产亚洲精品激情都市|