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实现的udp协议Server和Client代码实例
Jun 04 Python
深度定制Python的Flask框架开发环境的一些技巧总结
Jul 12 Python
Python编程实现使用线性回归预测数据
Dec 07 Python
Python实战小程序利用matplotlib模块画图代码分享
Dec 09 Python
关于django 数据库迁移(migrate)应该知道的一些事
May 27 Python
python进行两个表格对比的方法
Jun 27 Python
python将处理好的图像保存到指定目录下的方法
Jan 10 Python
Pytorch保存模型用于测试和用于继续训练的区别详解
Jan 10 Python
Python3变量与基本数据类型用法实例分析
Feb 14 Python
解决IDEA 的 plugins 搜不到任何的插件问题
May 04 Python
Python操作MySQL数据库的示例代码
Jul 13 Python
使用python如何删除同一文件夹下相似的图片
May 07 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 无限分类的树类代码
2009/12/03 PHP
使用PHP求两个文件的相对路径
2013/06/20 PHP
PHP常用工具类大全附全部代码下载
2015/12/07 PHP
PHP的反射机制实例详解
2017/03/29 PHP
ThinkPHP下表单令牌错误与解决方法分析
2017/05/20 PHP
可缩放Reloaded-一个针对可缩放元素的复用组件
2007/03/10 Javascript
js实现上传图片之上传前预览图片
2013/03/25 Javascript
jQuery动态创建html元素的常用方法汇总
2014/09/05 Javascript
Jquery api 速查表分享
2015/01/12 Javascript
分享一道关于闭包、bind和this的面试题
2017/02/20 Javascript
layui select动态添加option的实例
2018/03/07 Javascript
Node.js中读取TXT文件内容fs.readFile()用法
2018/10/10 Javascript
详解vue中this.$emit()的返回值是什么
2019/04/07 Javascript
layui实现数据分页功能
2019/07/27 Javascript
Node如何后台数据库使用增删改查功能
2019/11/21 Javascript
[01:31:03]DOTA2完美盛典全回顾 见证十五项大奖花落谁家
2017/11/28 DOTA
详解python开发环境搭建
2016/12/16 Python
Python将多个excel表格合并为一个表格
2021/02/22 Python
centos6.8安装python3.7无法import _ssl的解决方法
2018/09/17 Python
python 将list转成字符串,中间用符号分隔的方法
2018/10/23 Python
对numpy中向量式三目运算符详解
2018/10/31 Python
Python3模拟登录操作实例分析
2019/03/12 Python
python中实现栈的三种方法
2020/12/19 Python
python软件测试Jmeter性能测试JDBC Request(结合数据库)的使用详解
2021/01/26 Python
全球精选男装和家居用品:Article
2020/04/13 全球购物
顺丰快递Java软件工程师面试题
2015/07/31 面试题
运动会广播稿500字
2014/01/28 职场文书
工程采购员岗位职责
2014/03/09 职场文书
《最大的麦穗》教学反思
2014/04/17 职场文书
推广普通话演讲稿
2014/05/23 职场文书
企业挂职心得体会
2014/09/10 职场文书
考研英语复习计划
2015/01/19 职场文书
结婚保证书(卖身契)
2015/02/26 职场文书
人身损害赔偿协议书
2016/03/22 职场文书
WebRTC记录音视频流(web技术分享)
2022/02/24 Javascript
分享几个简单MySQL优化小妙招
2022/03/31 MySQL