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 logging模块学习笔记
May 24 Python
Python发送email的3种方法
Apr 28 Python
python中循环语句while用法实例
May 16 Python
Python中的数学运算操作符使用进阶
Jun 20 Python
用Python解决计数原理问题的方法
Aug 04 Python
Python cookbook(数据结构与算法)实现对不原生支持比较操作的对象排序算法示例
Mar 15 Python
Python cookbook(数据结构与算法)根据字段将记录分组操作示例
Mar 19 Python
django中静态文件配置static的方法
May 20 Python
Python中base64与xml取值结合问题
Dec 22 Python
python输出pdf文档的实例
Feb 13 Python
详解pycharm连接远程linux服务器的虚拟环境的方法
Nov 13 Python
python井字棋游戏实现人机对战
Apr 28 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
Home Coffee Roasting
2021/03/03 咖啡文化
Yii中render和renderPartial的区别
2014/09/03 PHP
Javascript调用XML制作连动下拉列表框
2006/06/25 Javascript
PJBlog插件 防刷新的在线播放器
2006/10/25 Javascript
基础的prototype.js常用函数及其用法
2007/03/10 Javascript
JQuery 绑定事件时传递参数的实现方法
2009/10/13 Javascript
jValidate 基于jQuery的表单验证插件
2009/12/12 Javascript
js操作时间(年-月-日 时-分-秒 星期几)
2010/06/20 Javascript
Ext JS 4实现带week(星期)的日期选择控件(实战一)
2013/08/21 Javascript
jquery获取div距离窗口和父级dv的距离示例
2013/10/10 Javascript
js中动态创建json,动态为json添加属性、属性值的实例
2016/12/02 Javascript
bootstrap+jQuery 实现下拉菜单中复选框全选和全不选效果
2017/06/12 jQuery
详解基于webpack2.x的vue2.x的多页面站点
2017/08/21 Javascript
原生js实现仿window10系统日历效果的实例
2017/10/31 Javascript
微信小程序scroll-view组件实现滚动动画
2018/01/31 Javascript
JS数组去重常用方法实例小结【4种方法】
2018/05/28 Javascript
微信小程序跨页面数据传递事件响应实现过程解析
2019/12/19 Javascript
js实现移动端吸顶效果
2020/01/08 Javascript
基于JS判断对象是否是数组
2020/01/10 Javascript
微信小程序如何实现radio单选框单击打勾和取消
2020/01/21 Javascript
支付宝小程序实现省市区三级联动
2020/06/21 Javascript
Python 26进制计算实现方法
2015/05/28 Python
python数据抓取分析的示例代码(python + mongodb)
2017/12/25 Python
在dataframe两列日期相减并且得到具体的月数实例
2018/07/03 Python
推荐10款最受Python开发者欢迎的Python IDE
2018/09/16 Python
PyTorch基本数据类型(一)
2019/05/22 Python
PyQt5 实现字体大小自适应分辨率的方法
2019/06/18 Python
selenium2.0中常用的python函数汇总
2019/08/05 Python
Python操作列表常用方法实例小结【创建、遍历、统计、切片等】
2019/10/25 Python
Python实现新型冠状病毒传播模型及预测代码实例
2020/02/05 Python
沃尔玛加拿大:Walmart.ca
2020/03/02 全球购物
工作失误检讨书范文大全
2014/01/13 职场文书
业务员简历自我评价
2014/03/06 职场文书
捐书活动倡议书
2015/04/27 职场文书
解决python存数据库速度太慢的问题
2021/04/23 Python
golang协程池模拟实现群发邮件功能
2021/05/02 Golang