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正则表达式使用经典实例
Jun 21 Python
python 类详解及简单实例
Mar 24 Python
微信跳一跳python自动代码解读1.0
Jan 12 Python
pip install urllib2不能安装的解决方法
Jun 12 Python
python计算列表内各元素的个数实例
Jun 29 Python
解决python中画图时x,y轴名称出现中文乱码的问题
Jan 29 Python
在Python中过滤Windows文件名中的非法字符方法
Jun 10 Python
Python数据可视化:顶级绘图库plotly详解
Dec 07 Python
python爬虫实例之获取动漫截图
May 31 Python
详解pandas.DataFrame.plot() 画图函数
Jun 14 Python
Python如何使用27行代码绘制星星图
Jul 20 Python
python开发的自动化运维工具ansible详解
Aug 07 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语言的7种基本的排序方法
2020/12/28 PHP
IE6下CSS图片缓存问题解决方法
2010/12/09 Javascript
文本框input聚焦失焦样式实现代码
2012/10/12 Javascript
Window.Open打开窗体和if嵌套代码
2016/04/15 Javascript
jQuery Easyui Tabs扩展根据自定义属性打开页签
2016/08/15 Javascript
在javascript中使用com组件的简单实现方法
2016/08/17 Javascript
Angularjs中的ui-bootstrap的使用教程
2017/02/19 Javascript
vuejs2.0实现分页组件使用$emit进行事件监听数据传递的方法
2017/02/22 Javascript
详解Node 定时器
2018/02/26 Javascript
解决vue2.0 element-ui中el-upload的before-upload方法返回false时submit()不生效问题
2018/08/24 Javascript
基于Proxy的小程序状态管理实现
2019/06/14 Javascript
vue实现页面滚动到底部刷新
2019/08/16 Javascript
解决Vue keep-alive 调用 $destory() 页面不再被缓存的情况
2020/10/30 Javascript
[03:30]完美盛典趣味短片 CSGO2019年度名场面
2019/12/07 DOTA
Python list操作用法总结
2015/11/10 Python
python使用matplotlib绘制柱状图教程
2017/02/08 Python
python3.6.3+opencv3.3.0实现动态人脸捕获
2018/05/25 Python
详解pyppeteer(python版puppeteer)基本使用
2019/06/12 Python
python pandas获取csv指定行 列的操作方法
2019/07/12 Python
Keras官方中文文档:性能评估Metrices详解
2020/06/15 Python
详解html2canvas截图不能截取圆角图片的解决方案
2018/01/30 HTML / CSS
英国鹦鹉店:Parrot Essentials
2018/12/03 全球购物
大码女装:Ulla Popken
2019/08/06 全球购物
奥地利领先的在线药房:SHOP APOTHEKE
2019/10/07 全球购物
如何打开WebSphere远程debug
2014/10/10 面试题
网络教育自我鉴定
2014/02/04 职场文书
幼儿教师寄语集锦
2014/04/03 职场文书
《神奇的克隆》教学反思
2014/04/10 职场文书
学生安全责任书模板
2014/07/25 职场文书
党员弘扬焦裕禄精神思想汇报
2014/09/10 职场文书
违纪学生保证书
2015/02/27 职场文书
面试通知单大全
2015/04/20 职场文书
运动会闭幕式通讯稿
2015/07/18 职场文书
2015年办税服务厅工作总结
2015/07/23 职场文书
百日宴上的祝酒词
2015/08/10 职场文书
小学三年级数学教学反思
2016/02/16 职场文书