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-基础-入门 简介
Aug 09 Python
Python的for和break循环结构中使用else语句的技巧
May 24 Python
Python读取指定目录下指定后缀文件并保存为docx
Apr 23 Python
python三方库之requests的快速上手
Mar 04 Python
python里 super类的工作原理详解
Jun 19 Python
Python3.5以上版本lxml导入etree报错的解决方案
Jun 26 Python
Python实现计算对象的内存大小示例
Jul 10 Python
使用Python脚本zabbix自定义key监控oracle连接状态
Aug 28 Python
详解Python图像处理库Pillow常用使用方法
Sep 02 Python
python bluetooth蓝牙信息获取蓝牙设备类型的方法
Nov 29 Python
Pytorch上下采样函数--interpolate用法
Jul 07 Python
Django 如何实现文件上传下载
Apr 08 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中使用mktime获取时间戳的一个黑色幽默分析
2012/05/31 PHP
php中autoload的用法总结
2013/11/08 PHP
PHP连接MSSQL2008/2005数据库(SQLSRV)配置实例
2014/10/22 PHP
php intval函数用法总结
2019/04/14 PHP
Laravel 中使用简单的方法跟踪用户是否在线(推荐)
2019/10/30 PHP
javascript 操作select下拉列表框的一点小经验
2010/03/20 Javascript
基于jquery的复制网页内容到WORD的实现代码
2011/02/16 Javascript
JS对象与json字符串格式转换实例
2014/10/28 Javascript
逐一介绍Jquery data()、Jquery stop()、jquery delay()函数(详)
2015/11/04 Javascript
JS延时器提示框的应用实例代码解析
2016/04/27 Javascript
vue封装第三方插件并发布到npm的方法
2017/09/25 Javascript
使用electron实现百度网盘悬浮窗口功能的示例代码
2018/10/24 Javascript
微信小程序如何播放腾讯视频的实现
2019/09/20 Javascript
vue实现移动端项目多行文本溢出省略
2020/07/29 Javascript
CentOS6.5设置Django开发环境
2016/10/13 Python
python如何实现内容写在图片上
2018/03/23 Python
python实现求特征选择的信息增益
2018/12/18 Python
python根据时间获取周数代码实例
2019/09/30 Python
基于Tensorflow一维卷积用法详解
2020/05/22 Python
Python使用pycharm导入pymysql教程
2020/09/16 Python
Matplotlib中rcParams使用方法
2021/01/05 Python
HTML5 Notification(桌面提醒)功能使用实例
2014/03/17 HTML / CSS
德国网上药房:Apotal
2017/04/04 全球购物
毕业生就业自荐信
2013/12/04 职场文书
电子商务自荐书范文
2014/01/04 职场文书
思想汇报格式
2014/01/05 职场文书
单位消防安全制度
2014/01/12 职场文书
岗位说明书范文
2014/05/07 职场文书
2014入党积极分子破除“四风”思想汇报
2014/09/14 职场文书
群众路线剖析材料怎么写
2014/10/09 职场文书
电子商务实训报告总结
2014/11/05 职场文书
培训通知书模板
2015/04/17 职场文书
2016年寒假社会实践活动心得体会
2015/10/09 职场文书
2016年大学生暑期社会实践活动总结
2016/04/06 职场文书
使用Selenium实现微博爬虫(预登录、展开全文、翻页)
2021/04/13 Python
在python中读取和写入CSV文件详情
2022/06/28 Python