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实现二叉树的遍历
Dec 11 Python
Django读取Mysql数据并显示在前端的实例
May 27 Python
Python实现的远程登录windows系统功能示例
Jun 21 Python
Python初学者需要注意的事项小结(python2与python3)
Sep 26 Python
python pandas实现excel转为html格式的方法
Oct 23 Python
对Python中DataFrame选择某列值为XX的行实例详解
Jan 29 Python
Django框架模板的使用方法示例
May 25 Python
python实现倒计时小工具
Jul 29 Python
使用 Python 遍历目录树的方法
Feb 29 Python
解决python3中os.popen()出错的问题
Nov 19 Python
python 制作本地应用搜索工具
Feb 27 Python
python执行js代码的方法
May 13 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
ftp类(example.php)
2006/10/09 PHP
MySQL相关说明
2007/01/15 PHP
php生成二维码
2015/08/10 PHP
JQuery 操作select标签实现代码
2010/05/14 Javascript
JS中令人发指的valueOf方法介绍
2013/02/22 Javascript
理解Javascript闭包
2013/11/01 Javascript
JQuery验证jsp页面属性是否为空(实例代码)
2013/11/08 Javascript
jquery插件tytabs.jquery.min.js实现渐变TAB选项卡效果
2015/08/25 Javascript
JavaScript 正则表达式中global模式的特性
2016/02/25 Javascript
Bootstrap项目实战之首页内容介绍(全)
2016/04/25 Javascript
Bootstrap布局组件教程之Bootstrap下拉菜单
2016/06/12 Javascript
jQuery实现的简单排序功能示例【冒泡排序】
2017/01/13 Javascript
JS实现自动轮播图效果(自适应屏幕宽度+手机触屏滑动)
2017/06/19 Javascript
JS 组件系列之Bootstrap Table 冻结列功能IE浏览器兼容性问题解决方案
2017/06/30 Javascript
基于Vue中点击组件外关闭组件的实现方法
2018/03/06 Javascript
jQuery实现的上传图片本地预览效果简单示例
2018/03/29 jQuery
JS加密插件CryptoJS实现的Base64加密示例
2020/08/16 Javascript
详解vue几种主动刷新的方法总结
2019/02/19 Javascript
uni app仿微信顶部导航条功能
2019/09/17 Javascript
Vue可自定义tab组件用法实例
2019/10/24 Javascript
解决vue项目刷新后,导航菜单高亮显示的位置不对问题
2019/11/01 Javascript
JavaScript canvas动画实现时钟效果
2020/02/10 Javascript
Vue-cli打包后如何本地查看的操作
2020/09/02 Javascript
Python实现列表转换成字典数据结构的方法
2016/03/11 Python
使用Python更换外网IP的方法
2018/07/09 Python
鲜为人知的HTML5语音合成功能
2019/05/17 HTML / CSS
css3 transform 3d 使用css3创建动态3d立方体(html5实践)
2013/01/06 HTML / CSS
html5摇一摇代码优化包括DeviceMotionEvent等等
2014/09/01 HTML / CSS
Clarks鞋法国官方网站:英国其乐鞋品牌
2018/02/11 全球购物
调解协议书
2014/04/16 职场文书
2014年党员创先争优承诺书
2014/05/29 职场文书
小组名称和口号
2014/06/09 职场文书
监理中标通知书
2015/04/16 职场文书
2015年暑期社会实践总结
2015/07/13 职场文书
信息技术远程培训心得体会
2016/01/09 职场文书
2016中学教师读书心得体会
2016/01/13 职场文书