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中的浅复制与深复制
Jul 02 Python
python搭建虚拟环境的步骤详解
Sep 27 Python
分析Python读取文件时的路径问题
Feb 11 Python
Python二进制串转换为通用字符串的方法
Jul 23 Python
python requests 测试代理ip是否生效
Jul 25 Python
浅谈Pycharm调用同级目录下的py脚本bug
Dec 03 Python
python创造虚拟环境方法总结
Mar 04 Python
Python从函数参数类型引出元组实例分析
May 28 Python
Python3多线程版TCP端口扫描器
Aug 31 Python
python中property和setter装饰器用法
Dec 19 Python
python 线性回归分析模型检验标准--拟合优度详解
Feb 24 Python
Python如何实现邮件功能
May 27 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创建PDF中文文档
2006/10/09 PHP
PHP中通过语义URL防止网站被攻击的方法分享
2011/09/08 PHP
PHP中extract()函数的定义和用法
2012/08/17 PHP
thinkPHP5框架实现基于ajax的分页功能示例
2018/06/12 PHP
网页上的Javascript编辑器和代码格式化
2010/04/25 Javascript
js DOM的学习笔记
2011/12/22 Javascript
js 将json字符串转换为json对象的方法解析
2013/11/13 Javascript
js为什么不能正确处理小数运算?
2015/12/29 Javascript
jQuery文字横向滚动效果的实现代码
2016/05/31 Javascript
Node.js DES加密的简单实现
2016/07/07 Javascript
AngularJS ng-controller 指令简单实例
2016/08/01 Javascript
jQuery插件FusionCharts实现的MSBar2D图效果示例【附demo源码】
2017/03/24 jQuery
JS常见构造模式实例对比分析
2018/08/27 Javascript
ES6 class类链式继承,实例化及react super(props)原理详解
2020/02/15 Javascript
Vue父子之间值传递的实例教程
2020/07/02 Javascript
如何HttpServletRequest文件对象并储存
2020/08/14 Javascript
如何编写一个 Webpack Loader的实现
2020/10/18 Javascript
javascript实现点击小图显示大图
2020/11/29 Javascript
jQuery实现动态向上滚动
2020/12/21 jQuery
python在windows下实现ping操作并接收返回信息的方法
2015/03/20 Python
Linux上安装Python的PIL和Pillow库处理图片的实例教程
2016/06/23 Python
python reverse反转部分数组的实例
2018/12/13 Python
对Python正则匹配IP、Url、Mail的方法详解
2018/12/25 Python
基于python3监控服务器状态进行邮件报警
2019/10/19 Python
使用OpenCV circle函数图像上画圆的示例代码
2019/12/27 Python
python 递归调用返回None的问题及解决方法
2020/03/16 Python
使用Python和百度语音识别生成视频字幕的实现
2020/04/09 Python
python实现一个简单RPC框架的示例
2020/10/28 Python
英国布鲁姆精品店:Bloom Boutique
2018/03/01 全球购物
Booking.com德国:预订最好的酒店和住宿
2020/02/16 全球购物
播音主持女孩的自我评价分享
2013/11/20 职场文书
技术岗位竞聘演讲稿
2014/05/16 职场文书
2014年幼儿园教师工作总结
2014/11/08 职场文书
外出听课学习心得体会
2016/01/15 职场文书
电力安全学习心得体会
2016/01/18 职场文书
sql server 累计求和实现代码
2022/02/28 SQL Server