• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問(wèn)答1問(wèn)答10問(wèn)答100問(wèn)答1000問(wèn)答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題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關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
    問(wèn)答文章1 問(wèn)答文章501 問(wèn)答文章1001 問(wèn)答文章1501 問(wèn)答文章2001 問(wèn)答文章2501 問(wèn)答文章3001 問(wèn)答文章3501 問(wèn)答文章4001 問(wèn)答文章4501 問(wèn)答文章5001 問(wèn)答文章5501 問(wèn)答文章6001 問(wèn)答文章6501 問(wèn)答文章7001 問(wèn)答文章7501 問(wèn)答文章8001 問(wèn)答文章8501 問(wèn)答文章9001 問(wèn)答文章9501
    當(dāng)前位置: 首頁(yè) - 科技 - 知識(shí)百科 - 正文

    理解生產(chǎn)者消費(fèi)者模型及在Python編程中的運(yùn)用實(shí)例

    來(lái)源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 14:29:08
    文檔

    理解生產(chǎn)者消費(fèi)者模型及在Python編程中的運(yùn)用實(shí)例

    理解生產(chǎn)者消費(fèi)者模型及在Python編程中的運(yùn)用實(shí)例:什么是生產(chǎn)者消費(fèi)者模型 在 工作中,大家可能會(huì)碰到這樣一種情況:某個(gè)模塊負(fù)責(zé)產(chǎn)生數(shù)據(jù),這些數(shù)據(jù)由另一個(gè)模塊來(lái)負(fù)責(zé)處理(此處的模塊是廣義的,可以是類、函數(shù)、線程、進(jìn)程等)。產(chǎn) 生數(shù)據(jù)的模塊,就形象地稱為生產(chǎn)者;而處理數(shù)據(jù)的模塊,就稱為消費(fèi)者。在
    推薦度:
    導(dǎo)讀理解生產(chǎn)者消費(fèi)者模型及在Python編程中的運(yùn)用實(shí)例:什么是生產(chǎn)者消費(fèi)者模型 在 工作中,大家可能會(huì)碰到這樣一種情況:某個(gè)模塊負(fù)責(zé)產(chǎn)生數(shù)據(jù),這些數(shù)據(jù)由另一個(gè)模塊來(lái)負(fù)責(zé)處理(此處的模塊是廣義的,可以是類、函數(shù)、線程、進(jìn)程等)。產(chǎn) 生數(shù)據(jù)的模塊,就形象地稱為生產(chǎn)者;而處理數(shù)據(jù)的模塊,就稱為消費(fèi)者。在
    什么是生產(chǎn)者消費(fèi)者模型

    在 工作中,大家可能會(huì)碰到這樣一種情況:某個(gè)模塊負(fù)責(zé)產(chǎn)生數(shù)據(jù),這些數(shù)據(jù)由另一個(gè)模塊來(lái)負(fù)責(zé)處理(此處的模塊是廣義的,可以是類、函數(shù)、線程、進(jìn)程等)。產(chǎn) 生數(shù)據(jù)的模塊,就形象地稱為生產(chǎn)者;而處理數(shù)據(jù)的模塊,就稱為消費(fèi)者。在生產(chǎn)者與消費(fèi)者之間在加個(gè)緩沖區(qū),我們形象的稱之為倉(cāng)庫(kù),生產(chǎn)者負(fù)責(zé)往倉(cāng)庫(kù)了進(jìn)商 品,而消費(fèi)者負(fù)責(zé)從倉(cāng)庫(kù)里拿商品,這就構(gòu)成了生產(chǎn)者消費(fèi)者模型。結(jié)構(gòu)圖如下:

    2016626144908200.jpg (401×74)

    生產(chǎn)者消費(fèi)者模型的優(yōu)點(diǎn):

    1、解耦

    假設(shè)生產(chǎn)者和消費(fèi)者分別是兩個(gè)類。如果讓生產(chǎn)者直接調(diào)用消費(fèi)者的某個(gè)方法,那么生產(chǎn)者對(duì)于消費(fèi)者就會(huì)產(chǎn)生依賴(也就是耦合)。將來(lái)如果消費(fèi)者的代碼發(fā)生變化, 可能會(huì)影響到生產(chǎn)者。而如果兩者都依賴于某個(gè)緩沖區(qū),兩者之間不直接依賴,耦合也就相應(yīng)降低了。

    舉個(gè)例子,我們?nèi)ム]局投遞信件,如果不使用郵筒(也就是緩沖區(qū)),你必須得把信直接交給郵遞員。有同學(xué)會(huì)說(shuō),直接給郵遞員不是挺簡(jiǎn)單的嘛?其實(shí)不簡(jiǎn)單,你必須 得認(rèn)識(shí)誰(shuí)是郵遞員,才能把信給他(光憑身上穿的制服,萬(wàn)一有人假冒,就慘了)。這就產(chǎn)生和你和郵遞員之間的依賴(相當(dāng)于生產(chǎn)者和消費(fèi)者的強(qiáng)耦合)。萬(wàn)一哪天郵遞員換人了,你還要重新認(rèn)識(shí)一下(相當(dāng)于消費(fèi)者變化導(dǎo)致修改生產(chǎn)者代碼)。而郵筒相對(duì)來(lái)說(shuō)比較固定,你依賴它的成本就比較低(相當(dāng)于和緩沖區(qū)之間的弱耦合)。

    2、支持并發(fā)

    由于生產(chǎn)者與消費(fèi)者是兩個(gè)獨(dú)立的并發(fā)體,他們之間是用緩沖區(qū)作為橋梁連接,生產(chǎn)者只需要往緩沖區(qū)里丟數(shù)據(jù),就可以繼續(xù)生產(chǎn)下一個(gè)數(shù)據(jù),而消費(fèi)者只需要從緩沖區(qū)了拿數(shù)據(jù)即可,這樣就不會(huì)因?yàn)楸舜说奶幚硭俣榷l(fā)生阻塞。

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

    3、支持忙閑不均

    緩沖區(qū)還有另一個(gè)好處。如果制造數(shù)據(jù)的速度時(shí)快時(shí)慢,緩沖區(qū)的好處就體現(xiàn)出來(lái)了。當(dāng)數(shù)據(jù)制造快的時(shí)候,消費(fèi)者來(lái)不及處理,未處理的數(shù)據(jù)可以暫時(shí)存在緩沖區(qū)中。 等生產(chǎn)者的制造速度慢下來(lái),消費(fèi)者再慢慢處理掉。

    為了充分復(fù)用,我們?cè)倌眉男诺睦觼?lái)說(shuō)事。假設(shè)郵遞員一次只能帶走1000封信。萬(wàn)一某次碰上情人節(jié)(也可能是圣誕節(jié))送賀卡,需要寄出去的信超過(guò)1000封,這時(shí) 候郵筒這個(gè)緩沖區(qū)就派上用場(chǎng)了。郵遞員把來(lái)不及帶走的信暫存在郵筒中,等下次過(guò)來(lái) 時(shí)再拿走。

    Python示例:
    利用隊(duì)列實(shí)現(xiàn)簡(jiǎn)單的生產(chǎn)者消費(fèi)者模型,生產(chǎn)者產(chǎn)生時(shí)間放入隊(duì)列,消費(fèi)者取出時(shí)間打印

    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() # 開(kāi)啟消費(fèi)者線程
     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()
    
    


    使用多線程,在做爬蟲的時(shí)候,生產(chǎn)者用著產(chǎn)生url鏈接,消費(fèi)者用于獲取url數(shù)據(jù),在隊(duì)列的幫助下可以使用多線程加快爬蟲速度。

    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()
    
    

    聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    理解生產(chǎn)者消費(fèi)者模型及在Python編程中的運(yùn)用實(shí)例

    理解生產(chǎn)者消費(fèi)者模型及在Python編程中的運(yùn)用實(shí)例:什么是生產(chǎn)者消費(fèi)者模型 在 工作中,大家可能會(huì)碰到這樣一種情況:某個(gè)模塊負(fù)責(zé)產(chǎn)生數(shù)據(jù),這些數(shù)據(jù)由另一個(gè)模塊來(lái)負(fù)責(zé)處理(此處的模塊是廣義的,可以是類、函數(shù)、線程、進(jìn)程等)。產(chǎn) 生數(shù)據(jù)的模塊,就形象地稱為生產(chǎn)者;而處理數(shù)據(jù)的模塊,就稱為消費(fèi)者。在
    推薦度:
    標(biāo)簽: 例子 及應(yīng)用 示例
    • 熱門焦點(diǎn)

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 久久精品麻豆日日躁夜夜躁| 国产精品欧美一区二区三区不卡| 久久精品aⅴ无码中文字字幕重口| 8050免费午夜一级国产精品| 精品国产sm捆绑最大网免费站 | 亚洲精品在线视频| 2024国产精品极品色在线| 国产精品美女久久久久久2018 | 精品无码一级毛片免费视频观看| 精品一区二区三区中文字幕| 久久精品中文字幕无码绿巨人| 久久久无码精品午夜| 国产成人精品久久| 香蕉久久夜色精品国产小说| 99久久国产热无码精品免费| 十八18禁国产精品www| 欧美精品在线视频| 精品视频一区二区三区| 国产精品免费大片一区二区| 久久福利青草精品资源站| 国产精品无码日韩欧| 人人妻人人澡人人爽人人精品97 | 欧美成人精品网站播放| 精品一久久香蕉国产线看播放| 成人精品一区二区久久| 99热成人精品国产免男男| 久久精品中文字幕久久| 国产亚洲福利精品一区| 99在线精品视频| 2022年国产精品久久久久| 91麻豆精品国产自产在线观看一区 | 亚洲欧美国产∧v精品综合网 | 无码人妻一区二区三区精品视频 | 99精品国产高清一区二区麻豆| 国产精品一区二区久久不卡| 久久精品国产亚洲AV电影| 久久这里只有精品18| 国语精品一区二区三区| 国产精品嫩草影院AV| 国产精品天天影视久久综合网| 国产精品久久久久久福利漫画|