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删除空文件和空文件夹的方法
Jul 14 Python
利用Python爬取可用的代理IP
Aug 18 Python
Python实现接受任意个数参数的函数方法
Apr 21 Python
python模块smtplib实现纯文本邮件发送功能
May 22 Python
python 用正则表达式筛选文本信息的实例
Jun 05 Python
Python给定一个句子倒序输出单词以及字母的方法
Dec 20 Python
对python生成业务报表的实例详解
Feb 03 Python
django模板加载静态文件的方法步骤
Mar 01 Python
在Pytorch中计算卷积方法的区别详解(conv2d的区别)
Jan 03 Python
python调用API接口实现登陆短信验证
May 10 Python
python名片管理系统开发
Jun 18 Python
python中round函数保留两位小数的方法
Dec 04 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电台频率大全 - 25 云南省
2020/03/11 无线电
实现了一个PHP5的getter/setter基类的代码
2007/02/25 PHP
收集的二十一个实用便利的PHP函数代码
2010/04/22 PHP
PHP不用递归实现无限分级的例子分享
2014/04/18 PHP
WordPress中用于获取文章信息以及分类链接的函数用法
2015/12/18 PHP
让网页根据不同IE版本显示不同的内容
2009/02/08 Javascript
jQuery使用技巧简单汇总
2013/04/18 Javascript
jquery的map与get方法详解
2013/11/04 Javascript
jQuery实现的多屏图像图层切换效果实例
2015/05/07 Javascript
微信小程序-横向滑动scroll-view隐藏滚动条
2017/04/20 Javascript
微信小程序中做用户登录与登录态维护的实现详解
2017/05/17 Javascript
微信小程序网络请求wx.request详解及实例
2017/05/18 Javascript
JavaScript实现简单的树形菜单效果
2017/06/23 Javascript
JavaScript对象_动力节点Java学院整理
2017/06/23 Javascript
Vue渲染函数详解
2017/09/15 Javascript
js通过Date对象实现倒计时动画效果
2017/10/27 Javascript
React-native桥接Android原生开发详解
2018/01/17 Javascript
使用webpack构建应用的方法步骤
2019/03/04 Javascript
thinkjs微信中控之微信鉴权登陆的实现代码
2019/08/08 Javascript
Python爬取网易云音乐热门评论
2017/03/31 Python
利用Python+Java调用Shell脚本时的死锁陷阱详解
2018/01/24 Python
对python 生成拼接xml报文的示例详解
2018/12/28 Python
Python HTML解析器BeautifulSoup用法实例详解【爬虫解析器】
2019/04/05 Python
Python面向对象程序设计之私有属性及私有方法示例
2019/04/08 Python
python图形用户接口实例详解
2019/12/16 Python
Pytorch之contiguous的用法
2019/12/31 Python
HTML5+CSS3实现机器猫
2016/10/17 HTML / CSS
库存图片、照片、矢量图、视频和音乐:Shutterstock
2021/02/12 全球购物
荷兰最大的鞋子、服装和运动折扣店:Bristol
2021/01/07 全球购物
英语系本科生求职信范文
2013/12/18 职场文书
开学典礼决心书
2014/03/11 职场文书
2014年圣诞节促销方案
2014/03/14 职场文书
房地产项目合作意向书
2015/05/08 职场文书
论文评审意见
2015/06/05 职场文书
深入理解Vue的数据响应式
2021/05/15 Vue.js
Win11无法访问设备和打印机 如何解决页面空白
2022/04/09 数码科技