Python  Asyncio模块实现的生产消费者模型的方法


Posted in Python onMarch 01, 2021

asyncio的关键字说明

  • event_loop事件循环:程序开启一个无限循环,把一些函数注册到事件循环上,当满足事件发生的时候,调用相应的协程函数
  • coroutine协程:协程对象,指一个使用async关键字定义的函数,它的调用不会立即执行函数,而是会返回一个协程对象,协程对象需要注册到事件循环,由事件循环调用。
  • task任务:一个协程对象就是一个原生可以挂起的函数,任务则是对协程进一步封装,其中包含了任务的各种状态
  • future:代表将来执行或没有执行的任务结果。它和task上没有本质上的区别
  • async/await关键字:async定义一个协程,await用于挂起阻塞的异步调用接口,在python3.4是使用asyncio.coroutine/yield from

在设计模式中,生产消费者模型占有非常重要的地位,这个模型在现实世界中也有很多有意思的对应场景,比如做包子的人和吃包子的人,当两者速度不匹配时,就需要有一个模型来做匹配(偶合),实现做的包子都会依次消费掉。

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

生产消费者模型可以使用多线程和队列来实现,这里选择协程不仅是因为性能不错,而且整个下来逻辑清晰:

1. 先定义初始化的东西,要有个队列,要有生产者,要有消费者,要有装面包的盘子大小;

2. 生产者:根据盘子大小生产出对应的东西(面包),将东西放入盘子(queue);

3. 消费者:从盘子上取东西,每次取东西都是一个任务,每次任务完成,就标记为task_done(调用函数)。在这个层面,一直循环;

4. 主逻辑:实例化生产消费者模型对象,创建生产者协程,创建任务(ensure_future),收集协程结果,等待所有线程结束(join),手动取消两个消费者协程;

5. 运行:首先创建事件循环,然后进入主逻辑,直到完成,关闭循环。

到此这篇关于Python Asyncio模块实现的生产消费者模型的方法的文章就介绍到这了,更多相关Python生产消费者模型内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
使用PYTHON接收多播数据的代码
Mar 01 Python
Python3实现将文件树中所有文件和子目录归档到tar压缩文件的方法
May 22 Python
详解Python中表达式i += x与i = i + x是否等价
Feb 08 Python
Python爬虫实例爬取网站搞笑段子
Nov 08 Python
python 读取文本文件的行数据,文件.splitlines()的方法
Jul 12 Python
Django中使用Celery的方法示例
Nov 29 Python
python3 http提交json参数并获取返回值的方法
Dec 19 Python
Python中print和return的作用及区别解析
May 05 Python
Python try except异常捕获机制原理解析
Apr 18 Python
Docker如何部署Python项目的实现详解
Oct 26 Python
sklearn中的交叉验证的实现(Cross-Validation)
Feb 22 Python
pytorch 如何使用amp进行混合精度训练
May 24 Python
Python创建自己的加密货币的示例
Mar 01 #Python
python 实现网易邮箱邮件阅读和删除的辅助小脚本
Mar 01 #Python
详解Django中的FBV和CBV对比分析
Mar 01 #Python
Python3压缩和解压缩实现代码
Mar 01 #Python
python re模块常见用法例举
Mar 01 #Python
Python实现简单的2048小游戏
Mar 01 #Python
Python使用Turtle模块绘制国旗的方法示例
Feb 28 #Python
You might like
一个php生成16位随机数的代码(两种方法)
2014/09/16 PHP
yii实现CheckBox复选框在同一行显示的方法
2014/12/03 PHP
php格式化时间戳
2016/12/17 PHP
雄兵连第三季海报曝光,艾妮熙德成主角,蔷薇新造型
2021/03/09 国漫
js中巧用cssText属性批量操作样式
2011/03/13 Javascript
使用按钮控制以何种方式打开新窗口的属性介绍
2012/12/17 Javascript
基于JavaScript 类的使用详解
2013/05/07 Javascript
NodeJS制作爬虫全过程(续)
2014/12/22 NodeJs
JS实现页面中所有img对象添加onclick事件及新窗口查看图片的方法
2016/12/27 Javascript
利用Mongoose让JSON数据直接插入或更新到MongoDB
2017/05/03 Javascript
js移动端事件基础及常用事件库详解
2017/08/15 Javascript
JS简单实现滑动加载数据的方法示例
2017/10/18 Javascript
深入研究React中setState源码
2017/11/17 Javascript
在vue项目中使用Nprogress.js进度条的方法
2018/01/31 Javascript
粗略分析Python中的内存泄漏
2015/04/23 Python
Python DataFrame设置/更改列表字段/元素类型的方法
2018/06/09 Python
浅谈tensorflow中几个随机函数的用法
2018/07/27 Python
Pythony运维入门之Socket网络编程详解
2019/04/15 Python
如何使用django的MTV开发模式返回一个网页
2019/07/22 Python
如何基于python实现不邻接植花
2020/05/01 Python
使用Python防止SQL注入攻击的实现示例
2020/05/21 Python
canvas 实现 github404动态效果的示例代码
2017/11/15 HTML / CSS
Smashbox英国官网:美国知名彩妆品牌
2017/11/13 全球购物
德国健康生活方式网上商店:Landkaufhaus Mayer
2019/03/12 全球购物
HomeAway英国:全球领先的度假租赁在线市场
2020/02/03 全球购物
教师自我鉴定
2013/12/13 职场文书
学习自我鉴定
2014/02/01 职场文书
甜品蛋糕店创业计划书范文
2014/02/06 职场文书
开学季活动策划方案
2014/02/28 职场文书
2014婚礼司仪主持词
2014/03/14 职场文书
毕业寄语大全
2014/04/09 职场文书
八项规定个人对照检查材料思想汇报
2014/09/25 职场文书
2016年班主任新年寄语
2015/08/18 职场文书
Go语言带缓冲的通道实现
2021/04/26 Golang
Vue实现下拉加载更多
2021/05/09 Vue.js
Python实现信息管理系统
2022/06/05 Python