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 相关文章推荐
一个检测OpenSSL心脏出血漏洞的Python脚本分享
Apr 10 Python
python实现kNN算法
Dec 20 Python
Python过滤txt文件内重复内容的方法
Oct 21 Python
python实现windows壁纸定期更换功能
Jan 21 Python
Python将文字转成语音并读出来的实例详解
Jul 15 Python
Django 重写用户模型的实现
Jul 29 Python
python数组循环处理方法
Aug 26 Python
在Python中画图(基于Jupyter notebook的魔法函数)
Oct 28 Python
Python3加密解密库Crypto的RSA加解密和签名/验签实现方法实例
Feb 11 Python
一文解决django 2.2与mysql兼容性问题
Jul 15 Python
总结python多进程multiprocessing的相关知识
Jun 29 Python
Python加密技术之RSA加密解密的实现
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核心代码分析require和include的区别
2011/01/02 PHP
用PHP来计算某个目录大小的方法
2014/04/01 PHP
php实现的Cookies操作类实例
2014/09/24 PHP
PHP判断是否为空的几个函数对比
2015/04/21 PHP
Yii2增加验证码步骤详解
2016/04/25 PHP
PHP中SQL查询语句的id=%d解释(推荐)
2016/12/10 PHP
jQuery 1.3 和 Validation 验证插件1.5.1
2009/07/09 Javascript
jquery ajax jsonp跨域调用实例代码
2013/12/11 Javascript
JavaScript中对循环语句的优化技巧深入探讨
2014/06/06 Javascript
浅谈javascript中关于日期和时间的基础知识
2016/07/13 Javascript
react.js CMS 删除功能的实现方法
2017/04/17 Javascript
vue.js 左侧二级菜单显示与隐藏切换的实例代码
2017/05/23 Javascript
React + webpack 环境配置的方法步骤
2017/09/07 Javascript
three.js中文文档学习之通过模块导入
2017/11/20 Javascript
微信小程序实现图片上传放大预览删除代码
2020/06/28 Javascript
Element UI 自定义正则表达式验证方法
2018/09/04 Javascript
微信小程序一周时间表功能实现
2019/10/17 Javascript
ES6使用新特性Proxy实现的数据绑定功能实例
2020/05/11 Javascript
JS实现网站楼层导航效果代码实例
2020/06/16 Javascript
jQuery实现穿梭框效果
2021/01/19 jQuery
[00:42]《辉夜杯》—职业组预选赛12月3日15点 正式打响
2015/12/03 DOTA
[36:09]Secret vs VG 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.24
2019/09/10 DOTA
Python内建模块struct实例详解
2018/02/02 Python
Python读写/追加excel文件Demo分享
2018/05/03 Python
Pycharm以root权限运行脚本的方法
2019/01/19 Python
使用python进行波形及频谱绘制的方法
2019/06/17 Python
基于pandas中expand的作用详解
2019/12/17 Python
Python figure参数及subplot子图绘制代码
2020/04/18 Python
CSS3 filter(滤镜)实现网页灰色或者黑色模式的示例代码
2021/02/24 HTML / CSS
be2台湾单身男女交友:全球网路婚姻介绍的领导品牌
2019/10/11 全球购物
应届生自我鉴定
2013/12/11 职场文书
运动会邀请函范文
2014/01/31 职场文书
工伤赔偿协议书
2014/04/15 职场文书
志愿者活动总结
2014/04/28 职场文书
《实心球》教学反思
2016/02/23 职场文书
2016学雷锋优秀志愿者事迹材料
2016/02/25 职场文书