python中利用队列asyncio.Queue进行通讯详解

yizhihongxing

下面我将详细讲解在Python中利用队列 asyncio.Queue 进行通讯的攻略。

什么是 asyncio.Queue

asyncio.Queue 是 Python 3.5 版本开始引入的异步队列,用于在协程之间进行通讯。根据先进先出(FIFO)原则,队列中的每个元素都具有唯一的索引位置,并且可以根据索引位置进行访问。

使用 asyncio.Queue 可以方便地实现协程之间的通讯和数据共享,避免了协程之间的竞争和阻塞等问题。

asyncio.Queue 的基础用法

下面是 asyncio.Queue 的基础用法:

import asyncio

async def producer(queue):
    print('生产者开始生产消息')
    for i in range(5):
        await asyncio.sleep(0.1)  # 模拟生产速度
        item = f'消息{i}'
        await queue.put(item)  # 往队列中放入新消息
        print(f'生产者生产了消息:{item}')

async def consumer(queue):
    print('消费者开始消费消息')
    while True:
        item = await queue.get()  # 从队列中取出消息
        print(f'消费者消费了消息:{item}')

async def main():
    queue = asyncio.Queue()  # 创建队列
    task1 = asyncio.create_task(producer(queue))
    task2 = asyncio.create_task(consumer(queue))
    await task1
    await task2

asyncio.run(main())  # 运行主函数

这里定义了两个协程 producerconsumer,分别表示生产者和消费者。在 main 函数中创建一个队列 queue,并将其传递给生产者和消费者协程。producer 协程不断地生产消息并将其放入队列中,consumer 协程不断地从队列中取出消息并消费它。在最后的 asyncio.run() 函数中执行主函数 main

当程序运行时,可以看到生产者不断地生产消息,消费者不断地消费消息,而且整个通讯过程是异步的。

asyncio.Queue 的高级用法

除了基础用法之外,asyncio.Queue 还支持以下高级用法:

消息缓存

往队列中放入消息时,如果队列已经满了,就会阻塞生产者直到有消费者取出消息。可以通过设置队列的 maxsize 属性来控制队列的最大长度。

import asyncio

async def producer(queue):
    for i in range(5):
        item = f'消息{i}'
        await queue.put(item)  # 往队列中放入新消息
        print(f'生产者生产了消息:{item}')

async def consumer(queue):
    while True:
        item = await queue.get()  # 从队列中取出消息
        print(f'消费者消费了消息:{item}')

async def main():
    queue = asyncio.Queue(maxsize=2)  # 设置最大长度为 2
    task1 = asyncio.create_task(producer(queue))
    task2 = asyncio.create_task(consumer(queue))
    await asyncio.gather(task1, task2)

asyncio.run(main())  # 运行主函数

在这个例子中,将队列的 maxsize 属性设置为 2,当第三条消息 消息2 添加到队列中时,就会阻塞生产者直到有消费者取出该消息。

超时设置

往队列中放入消息或从队列中取出消息时,可以设置超时时间,从而防止程序无限地阻塞等待。

import asyncio

async def producer(queue):
    for i in range(5):
        item = f'消息{i}'
        try:
            await queue.put(item, timeout=1)  # 超时设置为 1 秒
            print(f'生产者生产了消息:{item}')
        except asyncio.TimeoutError:
            print(f'生产者放置消息超时:{item}')

async def consumer(queue):
    while True:
        try:
            item = await queue.get(timeout=1)  # 超时设置为 1 秒
            print(f'消费者消费了消息:{item}')
        except asyncio.TimeoutError:
            print(f'消费者取出消息超时')

async def main():
    queue = asyncio.Queue(maxsize=2)  # 设置最大长度为 2
    task1 = asyncio.create_task(producer(queue))
    task2 = asyncio.create_task(consumer(queue))
    await asyncio.gather(task1, task2)

asyncio.run(main())  # 运行主函数

在这个例子中,将超时时间设置为 1 秒,当队列已满或已空时,放置消息或取出消息操作就会在 1 秒后超时。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python中利用队列asyncio.Queue进行通讯详解 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • python 使用fileinput读取文件

    使用Python的fileinput模块可以方便地读取多个文件的内容,可以使用标准输入(stdin)或命令行参数指定的文件列表。下面是具体的步骤和示例说明: 步骤 导入fileinput模块: import fileinput 创建fileinput实例: file = fileinput.input(files=None, inplace=False, b…

    python 2023年6月3日
    00
  • 如何在python 3中将字典对象转换为字符串

    【问题标题】:How to convert dictionary object into string in python 3如何在python 3中将字典对象转换为字符串 【发布时间】:2023-04-01 22:08:01 【问题描述】: 我有嵌套的字典,我需要把这个字典串起来 字典示例 data = { ‘filter’: { ‘operator’: …

    Python开发 2023年4月8日
    00
  • python uuid模块使用实例

    当我们需要生成唯一标识符(UUID)时,可以使用 Python 中的 uuid 模块。uuid 模块默认实现了 UUID 版本 1、3、4、5。 UUID 版本说明 在使用 UUID 生成唯一标识符之前,我们需要了解 UUID 的版本以及它们的特点。 UUID1: 基于主机的 MAC 地址和当前时间戳生成,保证全球唯一性,但可能存在重复的风险。 UUID3:…

    python 2023年6月3日
    00
  • python实现Excel多行多列的转换的示例

    下面我将介绍如何用 Python 实现 Excel 多行多列的转换示例,包括以下内容: 安装必要的库 读取Excel文件数据 转换Excel文件数据 写入转换后数据到新的Excel文件中 以下是完整实例教程: 1. 安装必要的库 这个程序需要用到 pandas 和 openpyxl 库,所以需要先安装: pip install pandas openpyxl…

    python 2023年5月13日
    00
  • Python正则获取、过滤或者替换HTML标签的方法

    以下是“Python正则获取、过滤或者替换HTML标签的方法”的完整攻略: 一、问题描述 在Python中,我们经常需要处理HTML文本,包括获取、过滤或者替换HTML标签。本文将详细讲解Python正则获取、过滤或者替换HTML标签的方法,并提供两个示例说明。 二、解决方案 2.1 获取HTML标签 在Python中,我们可以使用正则表达式获取HTML标签…

    python 2023年5月14日
    00
  • Python中的变量、运算符与流程控制

    Python中的变量、运算符与流程控制 变量 在Python中,变量的声明无需显式指定数据类型,变量的类型是根据其所存储的值确定的。变量在使用之前需要进行声明,但不必指定类型,通过赋值来进行初始化。 变量名的命名规范为:只包含字母、数字、下划线,不能以数字开头,不能与Python的关键字重名。 示例代码: # 变量的声明和初始化 num = 5 str = …

    python 2023年5月31日
    00
  • 13个有趣又好玩的Python游戏代码分享

    以下是详细讲解“13个有趣又好玩的Python游戏代码分享”的完整攻略,包含两个示例说明。 1. 猜数字游戏 猜数字游戏是一种简单而有趣的游戏,玩家需要猜测一个随机生成的数字。以下是一个使用Python实现猜数字游戏: import random number = random.randint(1, 100) guess = int(input("…

    python 2023年5月14日
    00
  • python中函数的参数详解

    Python中函数的参数详解 在Python中,函数的参数通常分为位置参数和关键字参数两种类型。这篇文章将对Python中函数的参数做详细的介绍,并提供一些常用的技巧。 位置参数 位置参数是指在函数调用中,根据形参的顺序,一个一个传入实参的方式。例如: def greet(name, age): print("Hello, my name is&q…

    python 2023年6月5日
    00
合作推广
合作推广
分享本页
返回顶部