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中的MySQLdb模块添加超时功能的教程
May 05 Python
Python的爬虫包Beautiful Soup中用正则表达式来搜索
Jan 20 Python
详解pandas的外部数据导入与常用方法
May 01 Python
详解Python Matplotlib解决绘图X轴值不按数组排序问题
Aug 05 Python
Python中url标签使用知识点总结
Jan 16 Python
Tensorflow训练模型越来越慢的2种解决方案
Feb 07 Python
将自己的数据集制作成TFRecord格式教程
Feb 17 Python
记一次pyinstaller打包pygame项目为exe的过程(带图片)
Mar 02 Python
Python爬虫爬取、解析数据操作示例
Mar 27 Python
Python greenlet和gevent使用代码示例解析
Apr 01 Python
浅谈keras 的抽象后端(from keras import backend as K)
Jun 16 Python
python爬虫构建代理ip池抓取数据库的示例代码
Sep 22 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
全国FM电台频率大全 - 11 浙江省
2020/03/11 无线电
PHP关联数组的10个操作技巧
2013/01/21 PHP
PHP jQuery表单,带验证具体实现方法
2014/02/15 PHP
翻译整理的jQuery使用查询手册
2007/03/07 Javascript
jquery动画2.元素坐标动画效果(创建一个图片走廊)
2012/08/24 Javascript
利用js动态添加删除table行的示例代码
2013/12/16 Javascript
JS中操作JSON总结
2020/12/06 Javascript
JavaScript前端图片加载管理器imagepool使用详解
2014/12/29 Javascript
jQuery EasyUI datagrid在翻页以后仍能记录被选中行的实现代码
2016/08/15 Javascript
js中的DOM模拟购物车功能
2017/03/22 Javascript
javaScript动态添加Li元素的实例
2018/02/24 Javascript
jquery实现掷骰子小游戏
2019/10/24 jQuery
为react组件库添加typescript类型提示的方法
2020/06/15 Javascript
[41:05]Serenity vs Pain 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
python循环监控远程端口的方法
2015/03/14 Python
Pycharm远程调试openstack的方法
2017/11/21 Python
Django 配置多站点多域名的实现步骤
2019/05/17 Python
Python+pyplot绘制带文本标注的柱状图方法
2019/07/08 Python
Python 继承,重写,super()调用父类方法操作示例
2019/09/29 Python
Python性能分析工具Profile使用实例
2019/11/19 Python
tensorflow 限制显存大小的实现
2020/02/03 Python
python异常处理try except过程解析
2020/02/03 Python
为什么称python为胶水语言
2020/06/16 Python
python如何进入交互模式
2020/07/06 Python
基于python实现生成指定大小txt文档
2020/07/20 Python
使用Python实现NBA球员数据查询小程序功能
2020/11/09 Python
Python+Xlwings 删除Excel的行和列
2020/12/19 Python
如何查看浏览器对html5的支持情况
2020/12/15 HTML / CSS
Urban Outfitters英国官网:美国平价服饰品牌
2016/11/25 全球购物
捷克移动配件网上商店:ProMobily.cz
2019/03/15 全球购物
linux面试相关问题
2013/04/28 面试题
科级干部考察材料
2014/02/15 职场文书
公司委托书格式范本
2014/09/16 职场文书
社区综治工作汇报
2014/10/27 职场文书
pytorch中的torch.nn.Conv2d()函数图文详解
2022/02/28 Python
一文解答什么是MySQL的回表
2022/08/05 MySQL