亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時間:2016年06月26日 14:52:10   作者:j_hao104  
生產(chǎn)者消費者模型一般用于體現(xiàn)程序的多線程并發(fā)性,Python的多線程雖然受到GIL控制,但依然可以構(gòu)建隊列來簡單體現(xiàn)出模型的思路,這里我們就來共同理解生產(chǎn)者消費者模型及在Python編程中的運用實例:

什么是生產(chǎn)者消費者模型

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

2016626144908200.jpg (401×74)

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

1、解耦

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

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

2、支持并發(fā)

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

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

3、支持忙閑不均

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

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

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

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

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

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

相關文章

  • 深入解析Python編程中JSON模塊的使用

    深入解析Python編程中JSON模塊的使用

    這篇文章主要介紹了深入解析Python編程中JSON模塊的使用,舉例講解了如何使用Python解析JSON數(shù)據(jù),需要的朋友可以參考下
    2015-10-10
  • 通過Python pyecharts輸出保存圖片代碼實例

    通過Python pyecharts輸出保存圖片代碼實例

    這篇文章主要介紹了通過Python pyecharts輸出保存圖片代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-11-11
  • Python解析excel文件存入sqlite數(shù)據(jù)庫的方法

    Python解析excel文件存入sqlite數(shù)據(jù)庫的方法

    最近工作中遇到一個需求,需要使用Python解析excel文件并存入sqlite,本文就實現(xiàn)的過程做個總結(jié)分享給大家,文中包括數(shù)據(jù)庫設計、建立數(shù)據(jù)庫、Python解析excel文件、Python讀取文件名并解析和將解析的數(shù)據(jù)存儲入庫,有需要的朋友們下面來一起學習學習吧。
    2016-11-11
  • 一文教你如何用Python輕輕松松操作Excel,Word,CSV

    一文教你如何用Python輕輕松松操作Excel,Word,CSV

    數(shù)據(jù)處理是 Python 的一大應用場景,而 Excel 又是當前最流行的數(shù)據(jù)處理軟件。本文將為大家詳細介紹一下如何用Python輕輕松松操作Excel、Word、CSV,需要的可以參考一下
    2022-02-02
  • python實現(xiàn)多層感知器MLP(基于雙月數(shù)據(jù)集)

    python實現(xiàn)多層感知器MLP(基于雙月數(shù)據(jù)集)

    這篇文章主要為大家詳細介紹了python實現(xiàn)多層感知器MLP,基于雙月數(shù)據(jù)集,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • python中的np.argmax() 返回最大值索引號

    python中的np.argmax() 返回最大值索引號

    這篇文章主要介紹了python中的np.argmax() 返回最大值索引號操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • python正則表達式匹配IP代碼實例

    python正則表達式匹配IP代碼實例

    這篇文章主要介紹了python正則表達式匹配IP代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-12-12
  • Python+Selenium實現(xiàn)短視頻自動上傳與發(fā)布的實踐

    Python+Selenium實現(xiàn)短視頻自動上傳與發(fā)布的實踐

    本文主要介紹了Python+Selenium實現(xiàn)短視頻自動上傳與發(fā)布的實踐,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-04-04
  • Python如何在main中調(diào)用函數(shù)內(nèi)的函數(shù)方式

    Python如何在main中調(diào)用函數(shù)內(nèi)的函數(shù)方式

    這篇文章主要介紹了Python如何在main中調(diào)用函數(shù)內(nèi)的函數(shù)方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06
  • PyQt5實現(xiàn)從主窗口打開子窗口的方法

    PyQt5實現(xiàn)從主窗口打開子窗口的方法

    今天小編就為大家分享一篇PyQt5實現(xiàn)從主窗口打開子窗口的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-06-06

最新評論