最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python  Asyncio模塊實(shí)現(xiàn)的生產(chǎn)消費(fèi)者模型的方法

 更新時(shí)間:2021年03月01日 11:02:59   投稿:mrr  
這篇文章主要介紹了Python Asyncio模塊實(shí)現(xiàn)的生產(chǎn)消費(fèi)者模型的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

asyncio的關(guān)鍵字說(shuō)明

  • event_loop事件循環(huán):程序開啟一個(gè)無(wú)限循環(huán),把一些函數(shù)注冊(cè)到事件循環(huán)上,當(dāng)滿足事件發(fā)生的時(shí)候,調(diào)用相應(yīng)的協(xié)程函數(shù)
  • coroutine協(xié)程:協(xié)程對(duì)象,指一個(gè)使用async關(guān)鍵字定義的函數(shù),它的調(diào)用不會(huì)立即執(zhí)行函數(shù),而是會(huì)返回一個(gè)協(xié)程對(duì)象,協(xié)程對(duì)象需要注冊(cè)到事件循環(huán),由事件循環(huán)調(diào)用。
  • task任務(wù):一個(gè)協(xié)程對(duì)象就是一個(gè)原生可以掛起的函數(shù),任務(wù)則是對(duì)協(xié)程進(jìn)一步封裝,其中包含了任務(wù)的各種狀態(tài)
  • future:代表將來(lái)執(zhí)行或沒(méi)有執(zhí)行的任務(wù)結(jié)果。它和task上沒(méi)有本質(zhì)上的區(qū)別
  • async/await關(guān)鍵字:async定義一個(gè)協(xié)程,await用于掛起阻塞的異步調(diào)用接口,在python3.4是使用asyncio.coroutine/yield from

在設(shè)計(jì)模式中,生產(chǎn)消費(fèi)者模型占有非常重要的地位,這個(gè)模型在現(xiàn)實(shí)世界中也有很多有意思的對(duì)應(yīng)場(chǎng)景,比如做包子的人和吃包子的人,當(dāng)兩者速度不匹配時(shí),就需要有一個(gè)模型來(lái)做匹配(偶合),實(shí)現(xiàn)做的包子都會(huì)依次消費(fèi)掉。

import asyncio

class ConsumerProducerModel:
  def __init__(self, producer, consumer, queue=asyncio.Queue(), plate_size=6): # the plate holds 6pcs bread
    self.queue = queue
    self.producer = producer
    self.consumer = consumer
    self.plate_size = plate_size

  async def produce_bread(self):
    for i in range(self.plate_size):
      bread = f"bread {i}"
      await asyncio.sleep(0.5) # bread makes faster, 0.5s/pc
      await self.queue.put(bread)
      print(f'{self.producer} makes {bread}')

  async def consume_bread(self):
    while True:
      bread = await self.queue.get()
      await asyncio.sleep(1) # eat slower, 1s/pc
      print(f'{self.consumer} eats {bread}')
      self.queue.task_done()

async def main():
  queue = asyncio.Queue()
  cp1 = ConsumerProducerModel("John", "Grace", queue) # group 1
  cp2 = ConsumerProducerModel("Mike", "Lucy", queue) # group 2

  producer_1 = cp1.produce_bread()
  producer_2 = cp2.produce_bread()

  consumer_1 = asyncio.ensure_future(cp1.consume_bread())
  consumer_2 = asyncio.ensure_future(cp2.consume_bread())

  await asyncio.gather(*[producer_1, producer_2])
  await queue.join()
  consumer_1.cancel()
  consumer_2.cancel()

if __name__ == '__main__':
  loop = asyncio.get_event_loop()
  loop.run_until_complete(main())
  loop.close()

生產(chǎn)消費(fèi)者模型可以使用多線程和隊(duì)列來(lái)實(shí)現(xiàn),這里選擇協(xié)程不僅是因?yàn)樾阅懿诲e(cuò),而且整個(gè)下來(lái)邏輯清晰:

1. 先定義初始化的東西,要有個(gè)隊(duì)列,要有生產(chǎn)者,要有消費(fèi)者,要有裝面包的盤子大??;

2. 生產(chǎn)者:根據(jù)盤子大小生產(chǎn)出對(duì)應(yīng)的東西(面包),將東西放入盤子(queue);

3. 消費(fèi)者:從盤子上取東西,每次取東西都是一個(gè)任務(wù),每次任務(wù)完成,就標(biāo)記為task_done(調(diào)用函數(shù))。在這個(gè)層面,一直循環(huán);

4. 主邏輯:實(shí)例化生產(chǎn)消費(fèi)者模型對(duì)象,創(chuàng)建生產(chǎn)者協(xié)程,創(chuàng)建任務(wù)(ensure_future),收集協(xié)程結(jié)果,等待所有線程結(jié)束(join),手動(dòng)取消兩個(gè)消費(fèi)者協(xié)程;

5. 運(yùn)行:首先創(chuàng)建事件循環(huán),然后進(jìn)入主邏輯,直到完成,關(guān)閉循環(huán)。

到此這篇關(guān)于Python Asyncio模塊實(shí)現(xiàn)的生產(chǎn)消費(fèi)者模型的方法的文章就介紹到這了,更多相關(guān)Python生產(chǎn)消費(fèi)者模型內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 一文了解python 3 字符串格式化 F-string 用法

    一文了解python 3 字符串格式化 F-string 用法

    本文介紹在python 3 編程中,如何進(jìn)行字符串格式化。介紹了F-string的用法,通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的工作或?qū)W習(xí)具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2020-03-03
  • 使用Python實(shí)現(xiàn)為PDF文檔設(shè)置和移除密碼

    使用Python實(shí)現(xiàn)為PDF文檔設(shè)置和移除密碼

    在數(shù)字化時(shí)代,文檔的安全性變得越來(lái)越重要,特別是對(duì)于包含敏感信息的PDF文件,所以本文主要來(lái)和大家介紹一下如何使用Python實(shí)現(xiàn)為PDF文檔設(shè)置和移除密碼,需要的可以參考下
    2024-03-03
  • python 執(zhí)行文件時(shí)額外參數(shù)獲取的實(shí)例

    python 執(zhí)行文件時(shí)額外參數(shù)獲取的實(shí)例

    今天小編就為大家分享一篇python 執(zhí)行文件時(shí)額外參數(shù)獲取的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-12-12
  • Python 多線程C段掃描、檢測(cè) Ping掃描腳本的實(shí)現(xiàn)

    Python 多線程C段掃描、檢測(cè) Ping掃描腳本的實(shí)現(xiàn)

    這篇文章主要介紹了Python 多線程C段掃描、檢測(cè) Ping掃描腳本的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-09-09
  • python簡(jiǎn)單構(gòu)建可用IP代理池

    python簡(jiǎn)單構(gòu)建可用IP代理池

    這篇文章主要介紹了python構(gòu)建簡(jiǎn)單可以代理池,實(shí)現(xiàn)過(guò)程匹配ip:port的正則表達(dá)式、匹配出所有的ip與端口,放入列表、判斷爬取的代理ip是否可用、使用代理ip訪問(wèn)指定網(wǎng)站,具體實(shí)現(xiàn)需要的小伙伴可以參考下面文章內(nèi)容
    2022-02-02
  • 在Python中給Nan值更改為0的方法

    在Python中給Nan值更改為0的方法

    今天小編就為大家分享一篇在Python中給Nan值更改為0的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-10-10
  • 決策樹的python實(shí)現(xiàn)方法

    決策樹的python實(shí)現(xiàn)方法

    這篇文章主要介紹了決策樹的python實(shí)現(xiàn)方法,詳細(xì)分析了決策樹的優(yōu)缺點(diǎn)及算法思想并以完整實(shí)例形式講述了Python實(shí)現(xiàn)決策樹的方法,具有一定的借鑒價(jià)值,需要的朋友可以參考下
    2014-11-11
  • Python操作JSON文件的知識(shí)點(diǎn)整理

    Python操作JSON文件的知識(shí)點(diǎn)整理

    Python?提供了內(nèi)置的?json?模塊來(lái)處理?JSON?格式的文件。該模塊主要分為讀取和寫入?JSON?文件。本文主要為大家整理了一些Python操作JSON文件的知識(shí)點(diǎn),需要的可以參考一下
    2023-01-01
  • python對(duì)指定字符串逆序的6種方法(小結(jié))

    python對(duì)指定字符串逆序的6種方法(小結(jié))

    這篇文章主要介紹了python對(duì)指定字符串逆序的6種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • django如何根據(jù)現(xiàn)有數(shù)據(jù)庫(kù)表生成model詳解

    django如何根據(jù)現(xiàn)有數(shù)據(jù)庫(kù)表生成model詳解

    這篇文章主要給大家介紹了關(guān)于django如何根據(jù)現(xiàn)有數(shù)據(jù)庫(kù)表生成model的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Django具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-08-08

最新評(píng)論

曲靖市| 旌德县| 普格县| 陇西县| 扎兰屯市| 玉门市| 行唐县| 樟树市| 贵溪市| 崇阳县| 顺平县| 赤峰市| 阳原县| 怀安县| 宁蒗| 永嘉县| 东丰县| 察雅县| 衡阳市| 扶沟县| 治多县| 福清市| 卓尼县| 安吉县| 云南省| 苏尼特右旗| 柏乡县| 汝州市| 宽甸| 武城县| 元江| 象山县| 吐鲁番市| 纳雍县| 巴林右旗| 罗山县| 应用必备| 三门峡市| 金寨县| 台中县| 望谟县|