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将html转成PDF的实现代码(包含中文)
Mar 04 Python
Python中实现字符串类型与字典类型相互转换的方法
Aug 18 Python
Python获取央视节目单的实现代码
Jul 25 Python
Python学习笔记整理3之输入输出、python eval函数
Dec 14 Python
Python md5与sha1加密算法用法分析
Jul 14 Python
Python对List中的元素排序的方法
Apr 01 Python
python 将有序数组转换为二叉树的方法
Mar 26 Python
python远程邮件控制电脑升级版
May 23 Python
python matplotlib拟合直线的实现
Nov 19 Python
基于python实现计算且附带进度条代码实例
Mar 31 Python
如何使用Python对NetCDF数据做空间相关分析
Apr 21 Python
python之PySide2安装使用及QT Designer UI设计案例教程
Jul 26 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目录导航文件代码
2006/10/09 PHP
剖析 PHP 中的输出缓冲
2006/12/21 PHP
web站点获取用户IP的安全方法 HTTP_X_FORWARDED_FOR检验
2013/06/01 PHP
在 Laravel 中 “规范” 的开发短信验证码发送功能
2017/10/26 PHP
RR vs IO BO3 第二场2.13
2021/03/10 DOTA
按钮JS复制文本框和表格的代码
2011/04/01 Javascript
jQuery中fadeIn、fadeOut、fadeTo的使用方法(图片显示与隐藏)
2013/05/08 Javascript
一个JavaScript变量声明的知识点
2013/10/28 Javascript
控制input输入框中提示信息的显示和隐藏的方法
2014/02/12 Javascript
动态创建script标签实现跨域资源访问的方法介绍
2014/02/28 Javascript
基于OL2实现百度地图ABCD marker的效果
2015/10/01 Javascript
JavaScript判断数组重复内容的两种方法(推荐)
2016/06/06 Javascript
jQuery Raty 一款不错的星级评分插件
2016/08/24 Javascript
解决node.js安装包失败的几种方法
2016/09/02 Javascript
什么是JavaScript中的结果值?
2016/10/08 Javascript
Vue keep-alive实践总结(推荐)
2017/08/31 Javascript
详解小程序rich-text对富文本支持方案
2018/11/28 Javascript
js中的reduce()函数讲解
2019/01/18 Javascript
vue 对axios get pust put delete封装的实例代码
2020/01/05 Javascript
JavaScript封装单向链表的示例代码
2020/09/17 Javascript
Python File readlines() 使用方法
2018/03/19 Python
对Pyhon实现静态变量全局变量的方法详解
2019/01/11 Python
Django给admin添加Action的步骤详解
2019/05/01 Python
python 列表转为字典的两个小方法(小结)
2019/06/28 Python
python time.sleep()是睡眠线程还是进程
2019/07/09 Python
wxpython绘制音频效果
2019/11/18 Python
Python sklearn中的.fit与.predict的用法说明
2020/06/28 Python
Matplotlib中rcParams使用方法
2021/01/05 Python
优质有机椰子产品:Dr. Goerg
2019/09/24 全球购物
给排水专业应届生求职信
2013/10/12 职场文书
大专应届生个人简历的自我评价
2013/10/15 职场文书
党务公开方案
2014/05/06 职场文书
2014年教师业务学习材料
2014/05/12 职场文书
2015年售后服务工作总结
2015/04/25 职场文书
Pygame Event事件模块的详细示例
2021/11/17 Python
二维码条形码生成的JavaScript脚本库
2022/07/07 Javascript