Python  Asyncio模块实现的生产消费者模型的方法

 更新时间:2021年03月01日 11:02:59   投稿:mrr  
这篇文章主要介绍了Python Asyncio模块实现的生产消费者模型的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

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+Turtle绘制可爱的可达鸭

    Python+Turtle绘制可爱的可达鸭

    一年一度的六一儿童节又来了,祝大朋友小朋友节日快乐!本文主要介绍如何运用Python中的turtle库控制函数绘制可达鸭,希望你会喜欢
    2022-05-05
  • 使用Python编写简单的端口扫描器的实例分享

    使用Python编写简单的端口扫描器的实例分享

    这篇文章主要介绍了使用Python编写简单的端口扫描器的实例分享,文中分别介绍了单线程和多线程的实现方式,需要的朋友可以参考下
    2015-12-12
  • Python多进程模式实现多核CPU并行计算

    Python多进程模式实现多核CPU并行计算

    随着计算机硬件的不断发展,多核CPU已经成为普及的硬件设备,在本文中,我们将重点介绍在Python中如何利用多进程模式提高程序的执行效率,感兴趣的可以了解一下
    2023-05-05
  • 在VScode中配置Python开发环境的超详细指南

    在VScode中配置Python开发环境的超详细指南

    在使用VSCode编写Python代码前,我们需要先配置Python环境,这篇文章主要给大家介绍了关于在VScode中配置Python开发环境的相关资料,需要的朋友可以参考下
    2023-12-12
  • 使用Python3编写抓取网页和只抓网页图片的脚本

    使用Python3编写抓取网页和只抓网页图片的脚本

    这篇文章主要介绍了使用Python3编写抓取网页和只抓网页图片的脚本,使用到了urllib模块,需要的朋友可以参考下
    2015-08-08
  • Python初识二叉树续之实战binarytree

    Python初识二叉树续之实战binarytree

    binarytree库是一个Python的第三方库,这个库实现了一些二叉树相关的常用方法,使用二叉树时,可以直接调用,不需要再自己实现,下面这篇文章主要给大家介绍了关于Python初识二叉树之实战binarytree的相关资料,需要的朋友可以参考下
    2022-05-05
  • Django环境下使用Ajax的操作代码

    Django环境下使用Ajax的操作代码

    AJAX 的主要目标是在不刷新整个页面的情况下,通过后台与服务器进行数据交换和更新页面内容,通过 AJAX,您可以向服务器发送请求并接收响应,然后使用 JavaScript 动态地更新页面的部分内容,这篇文章主要介绍了Django环境下使用Ajax,需要的朋友可以参考下
    2024-03-03
  • 详解python里使用正则表达式的分组命名方式

    详解python里使用正则表达式的分组命名方式

    这篇文章主要介绍了详解python里使用正则表达式的分组命名方式的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下
    2017-10-10
  • 图文详解python安装Scrapy框架步骤

    图文详解python安装Scrapy框架步骤

    在本篇内容中我们给大家整理了关于python安装Scrapy框架的图文详细步骤,需要的朋友们跟着学习下。
    2019-05-05
  • python找出完数的方法

    python找出完数的方法

    今天小编就为大家分享一篇python找出完数的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-11-11

最新评论