<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答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
        主站蜘蛛池模板: 国产一二三四区乱码免费| 羞羞视频免费观看| 久久国产精品2020免费m3u8| 亚洲精品无码永久在线观看| 美女扒开屁股让男人桶爽免费| 国产成人免费片在线观看| 亚洲av无码无线在线观看| 国产大片免费观看中文字幕| 色噜噜的亚洲男人的天堂| 亚洲美日韩Av中文字幕无码久久久妻妇 | 青青青视频免费观看| 一区国严二区亚洲三区| 中文无码日韩欧免费视频| 亚洲爆乳无码专区| **真实毛片免费观看| 亚洲欧洲av综合色无码| 又粗又大又长又爽免费视频| 久久国产美女免费观看精品| 亚洲va久久久噜噜噜久久| 精品女同一区二区三区免费站| 久久精品国产亚洲av麻豆蜜芽| 免费无码又爽又刺激高潮的视频 | 波多野结衣久久高清免费 | 亚洲理论片中文字幕电影| 黄页网站在线看免费| 亚洲国产精品无码久久九九大片| 国产在线ts人妖免费视频| 久久www免费人成看国产片| 亚洲日本国产乱码va在线观看| 女性自慰aⅴ片高清免费| rh男男车车的车车免费网站| 亚洲精品天天影视综合网| 国产精品成人免费视频网站京东| 国产亚洲精品美女| 亚洲国产精品国自产拍AV| 国产一卡2卡3卡4卡无卡免费视频 国产一卡二卡3卡四卡免费 | 久久毛片免费看一区二区三区| 亚洲色欲或者高潮影院| 日本免费v片一二三区| 精品国产免费一区二区三区香蕉 | 久久久精品视频免费观看 |