Python 异步之生成器示例详解

目录
  • 正文
  • 1. 什么是异步生成器
    • 1.1. Generators
    • 1.2. Asynchronous Generators
  • 2. 如何使用异步生成器
    • 2.1. 定义
    • 2.2. 创建
    • 2.3. 一步
    • 2.4. 遍历
  • 3. 异步生成器示例

正文

生成器是 Python 的基本组成部分。生成器是一个至少有一个“yield”表达式的函数。它们是可以暂停和恢复的函数,就像协程一样。

实际上,Python 协程是 Python 生成器的扩展。Asyncio 允许我们开发异步生成器。我们可以通过定义一个使用“yield”表达式的协程来创建一个异步生成器。

1. 什么是异步生成器

异步生成器是使用 yield 表达式的协程。在我们深入了解异步生成器的细节之前,让我们先回顾一下经典的 Python 生成器。

1.1. Generators

生成器是一个 Python 函数,它通过 yield 表达式返回一个值。

# define a generator
def generator():
	for i in range(10):
		yield i

生成器执行到 yield 表达式,之后返回一个值。这会在该点暂停生成器。下一次执行生成器时,它将从恢复点恢复并运行直到下一个 yield 表达式。

从技术上讲,生成器函数创建并返回一个生成器迭代器。生成器迭代器执行生成器函数的内容,根据需要产生和恢复。

可以使用内置函数 next() 分步执行生成器。

...
# create the generator
gen = generator()
# step the generator
result = next(gen)

虽然,更常见的是迭代生成器直到完成,例如使用 for 循环或列表理解。

...
# traverse the generator and collect results
results = [item for item in generator()]

接下来,让我们仔细看看异步生成器。

1.2. Asynchronous Generators

异步生成器是使用 yield 表达式的协程。与函数生成器不同,协程可以调度和等待其他协程和任务。

与经典生成器一样,异步生成器函数可用于创建可使用内置的 anext() 函数而不是 next() 函数遍历的异步生成器迭代器。

这意味着异步生成器迭代器实现了 anext() 方法并且可以与 async for 表达式一起使用。

这意味着生成器的每次迭代都被安排并执行为可等待的。 “async for”表达式将调度并执行生成器的每次迭代,暂停调用协程并等待结果。

2. 如何使用异步生成器

在本节中,我们将仔细研究如何在 asyncio 程序中定义、创建、步进和遍历异步生成器。

让我们从如何定义异步生成器开始。

2.1. 定义

我们可以通过定义一个至少有一个 yield 表达式的协程来定义一个异步生成器。

这意味着该函数是使用“async def”表达式定义的。

# define an asynchronous generator
async def async_generator():
	for i in range(10)
		yield i

因为异步生成器是一个协程,并且每个迭代器返回一个在 asyncio 事件循环中调度和执行的等待对象,所以我们可以在生成器主体内执行和等待等待对象。

# define an asynchronous generator that awaits
async def async_generator():
	for i in range(10)
		# suspend and sleep a moment
		await asyncio.sleep(1)
		# yield a value to the caller
		yield i

接下来,让我们看看如何使用异步生成器。

2.2. 创建

要使用异步生成器,我们必须创建生成器。这看起来像是调用它,而是创建并返回一个迭代器对象。

...
# create the iterator
it = async_generator()

这将返回一种称为异步生成器迭代器的异步迭代器。

2.3. 一步

可以使用 anext() 内置函数遍历生成器的一个步骤,就像使用 next() 函数的经典生成器一样。

结果是等待的可等待对象。

...
# get an awaitable for one step of the generator
awaitable = anext(gen)
# execute the one step of the generator and get the result
result = await awaitable

这可以一步实现。

...
# step the async generator
result = await anext(gen)

2.4. 遍历

还可以使用“async for”表达式在循环中遍历异步生成器,该表达式将自动等待循环的每次迭代。

...
# traverse an asynchronous generator
async for result in async_generator():
	print(result)

我们还可以使用带有“async for”表达式的异步列表理解来收集生成器的结果。

...
# async list comprehension with async generator
results = [item async for item in async_generator()]

3. 异步生成器示例

我们可以探索如何使用“async for”表达式遍历异步生成器。

在此示例中,我们将更新之前的示例以使用“async for”循环遍历生成器直至完成。

此循环将自动等待从生成器返回的每个可等待对象,检索产生的值,并使其在循环体内可用,以便在这种情况下可以报告它。

这可能是异步生成器最常见的使用模式。

# SuperFastPython.com
# example of asynchronous generator with async for loop
import asyncio
# define an asynchronous generator
async def async_generator():
    # normal loop
    for i in range(10):
        # block to simulate doing work
        await asyncio.sleep(1)
        # yield the result
        yield i
# main coroutine
async def main():
    # loop over async generator with async for loop
    async for item in async_generator():
        print(item)
# execute the asyncio program
asyncio.run(main())

运行示例首先创建 main() 协程并将其用作 asyncio 程序的入口点。main() 协程运行并启动 for 循环。

异步生成器的一个实例被创建,循环使用 anext() 函数自动单步执行它以返回一个可等待对象。然后循环等待可等待对象并检索一个值,该值可用于报告它的循环体。

然后重复此过程,挂起 main() 协程,执行生成器的迭代,然后挂起和恢复 main() 协程,直到生成器耗尽。

这突出显示了如何使用 async for 表达式遍历异步生成器。

0
1
2
3
4
5
6
7
8
9

以上就是Python 异步之生成器示例详解的详细内容,更多关于Python 异步生成器的资料请关注我们其它相关文章!

(0)

相关推荐

  • Python异步之迭代器如何使用详解

    目录 正文 1. 什么是异步迭代器 1.1. Iterators 1.2. Asynchronous Iterators 2. 什么是“async for”循环? 3. 如何使用异步迭代器 4. 异步迭代器示例 正文 迭代是 Python 中的基本操作.我们可以迭代列表.字符串和所有其他结构. Asyncio 允许我们开发异步迭代器.我们可以通过定义一个实现 aiter() 和 anext() 方法的对象来在 asyncio 程序中创建和使用异步迭代器. 1. 什么是异步迭代器 异步迭代器是一个

  • 如何使用Python异步之上下文管理器

    目录 正文 1. 什么是异步上下文管理器 1.1. Context Manager 1.2. Asynchronous Context Manager 2. 如何使用异步上下文管理器 2.1. 定义 2.2. 使用 3. 异步上下文管理器和“异步”示例 正文 上下文管理器是一种 Python 构造,它提供了一个类似 try-finally 的环境,具有一致的接口和方便的语法,例如通过“with”表达. 它通常与资源一起使用,确保在我们完成资源后始终关闭或释放资源,无论资源的使用是成功还是因异常而

  • Python 异步之在 Asyncio中如何运行阻塞任务详解

    目录 正文 1. 阻塞任务 2. 如何运行阻塞任务 3. 实例 正文 阻塞任务是阻止当前线程继续进行的任务. 如果在 asyncio 程序中执行阻塞任务,它会停止整个事件循环,从而阻止任何其他协程继续进行. 我们可以通过 asyncio.to_thread() 和 loop.run_in_executor() 函数在 asyncio 程序中异步运行阻塞调用. 1. 阻塞任务 asyncio的重点是异步编程和非阻塞IO.然而,我们经常需要在 asyncio 应用程序中执行阻塞函数调用. 这可能有很

  • Python 异步之推导式示例详解

    目录 引言 1. 什么是异步推导式 2. 推导式 3. 异步推导式 4. Await 推导式 引言 当我们想到“pythonic”时,理解,如列表和字典理解是 Python 的一个特性. 这是我们执行循环的一种方式,与许多其他语言不同. Asyncio 允许我们使用异步推导式. 我们可以通过“async for”表达式使用异步推导式来遍历异步生成器和异步迭代器. 1. 什么是异步推导式 异步推导式是经典推导式的异步版本.Asyncio 支持两种类型的异步推导式,它们是“async for”推导式

  • Python 异步等待任务集合

    目录 正文 1. 什么是 asyncio.wait() 2. 如何使用 asyncio.wait() 3. 等待所有任务的示例 正文 我们可以通过 asyncio.wait() 函数等待异步任务完成.可以等待不同的条件,例如所有任务完成.第一个任务完成以及第一个任务因异常而失败. 让我们仔细看看. 1. 什么是 asyncio.wait() asyncio.wait() 函数可用于等待一组异步任务完成.回想一下,asyncio 任务是包装协程的 asyncio.Task 类的一个实例.它允许独立

  • Python 异步之如何获取当前和正在运行任务详解

    目录 正文 1. 如何获取当前任务 2. 如何获取所有任务 正文 我们可以反省在 asyncio 事件循环中运行的任务.这可以通过为当前运行的任务和所有正在运行的任务获取一个 asyncio.Task 对象来实现. 1. 如何获取当前任务 我们可以通过 asyncio.current_task() 函数获取当前任务.此函数将为当前正在运行的任务返回一个任务对象. ... # get the current task task = asyncio.current_task() 传递给 asynci

  • Python 异步如何使用等待有时间限制协程

    目录 正文 1. 什么是 Asyncio wait_for() 2. 如何使用 Asyncio wait_for() 3. 带有超时的 Asyncio wait_for() 示例 正文 我们可以使用 asyncio.wait_for() 函数等待 asyncio 任务或协程超时完成.如果在任务完成之前超时已过,任务将被取消. 1. 什么是 Asyncio wait_for() asyncio.wait_for() 函数允许调用者等待 asyncio 任务或协程超时完成.如果没有指定超时,wait

  • Python 异步之生成器示例详解

    目录 正文 1. 什么是异步生成器 1.1. Generators 1.2. Asynchronous Generators 2. 如何使用异步生成器 2.1. 定义 2.2. 创建 2.3. 一步 2.4. 遍历 3. 异步生成器示例 正文 生成器是 Python 的基本组成部分.生成器是一个至少有一个“yield”表达式的函数.它们是可以暂停和恢复的函数,就像协程一样. 实际上,Python 协程是 Python 生成器的扩展.Asyncio 允许我们开发异步生成器.我们可以通过定义一个使用

  • Python 迭代器与生成器实例详解

    Python 迭代器与生成器实例详解 一.如何实现可迭代对象和迭代器对象 1.由可迭代对象得到迭代器对象 例如l就是可迭代对象,iter(l)是迭代器对象 In [1]: l = [1,2,3,4] In [2]: l.__iter__ Out[2]: <method-wrapper '__iter__' of list object at 0x000000000426C7C8> In [3]: t = iter(l) In [4]: t.next() Out[4]: 1 In [5]: t.

  • 对python周期性定时器的示例详解

    一.用thread实现定时器 py_timer.py文件 #!/usr/bin/python #coding:utf-8 import threading import os import sys class _Timer(threading.Thread): def __init__(self, interval, function, args=[], kwargs={}): threading.Thread.__init__(self) self.interval = interval se

  • python assert的用处示例详解

    使用assert断言是学习python一个非常好的习惯,python assert 断言句语格式及用法很简单.在没完善一个程序之前,我们不知道程序在哪里会出错,与其让它在运行最崩溃,不如在出现错误条件时就崩溃,这时候就需要assert断言的帮助.本文主要是讲assert断言的基础知识. python assert断言的作用 python assert断言是声明其布尔值必须为真的判定,如果发生异常就说明表达示为假.可以理解assert断言语句为raise-if-not,用来测试表示式,其返回值为

  • python音频处理的示例详解

    准备工作: 首先,我们需要 import 几个工具包,一个是 python 标准库中的 wave 模块,用于音频处理操作,另外两个是 numpy 和 matplot,提供数据处理函数. 一:读取本地音频数据 处理音频第一步是需要从让计算机"听到"声音,这里我们使用 python 标准库中自带的 wave模块进行音频参数的获取. (1) 导入 wave 模块 (2) 使用 wave 中的函数 open 打开音频文件,wave.open(file,mode)函数带有两个参数, 第一个 fi

  • Python模块glob函数示例详解教程

    目录 本文大纲 支持4个常用的通配符 1)glob()函数 2)iglob()函数 3)escape()函数 总结 本文大纲 glob模块也是Python标准库中一个重要的模块,主要用来查找符合特定规则的目录和文件,并将搜索的到的结果返回到一个列表中.使用这个模块最主要的原因就是,该模块支持几个特殊的正则通配符,用起来贼方便,这个将会在下方为大家进行详细讲解. 支持4个常用的通配符 使用glob模块能够快速查找我们想要的目录和文件,就是由于它支持*.**.? .[ ]这三个通配符,那么它们到底是

  • python opencv图像处理基本操作示例详解

    目录 1.图像基本操作 ①读取图像 ②显示图像 ③视频读取 ④图像截取 ⑤颜色通道提取及还原 ⑥边界填充 ⑦数值计算 ⑧图像融合 2.阈值与平滑处理 ①设定阈值并对图像处理 ②图像平滑-均值滤波 ③图像平滑-方框滤波 ④图像平滑-高斯滤波 ⑤图像平滑-中值滤波 3.图像的形态学处理 ①腐蚀操作 ②膨胀操作 ③开运算和闭运算 4.图像梯度处理 ①梯度运算 ②礼帽与黑帽 ③图像的梯度处理 5.边缘检测 ①Canny边缘检测 1.图像基本操作 ①读取图像 ②显示图像 该函数中,name是显示窗口的名字

  • Python深度学习线性代数示例详解

    目录 标量 向量 长度.维度和形状 矩阵 张量 张量算法的基本性质 降维 点积 矩阵-矩阵乘法 范数 标量 标量由普通小写字母表示(例如,x.y和z).我们用 R \mathbb{R} R表示所有(连续)实数标量的空间. 标量由只有一个元素的张量表示.下面代码,我们实例化了两个标量,并使用它们执行一些熟悉的算数运算,即加法.乘法.除法和指数. import torch x = torch.tensor([3.0]) y = torch.tensor([2.0]) x + y, x * y, x

  • Python OpenCV形态学运算示例详解

    目录 1. 腐蚀 & 膨胀 1.1什么是腐蚀&膨胀 1.2 腐蚀方法 cv2.erode() 1.3 膨胀方法 cv2.dilate() 2. 开运算 & 闭运算 2.1 简述 2.2 开运算 2.3 闭运算 3. morphologyEx()方法 3.1 morphologyEx()方法 介绍 3.2 梯度运算 3.3 顶帽运算 3.4 黑帽运算 1. 腐蚀 & 膨胀 1.1什么是腐蚀&膨胀 腐蚀&膨胀是图像形态学中的两种核心操作 腐蚀可以描述为是让图像沿

  • Python实现数据清洗的示例详解

    目录 前言 去掉信息不全的用户 描述 答案 修补缺失的用户数据 描述 答案 解决牛客网用户重复的数据 描述 答案 统一最后刷题日期的格式 描述 答案 将用户的json文件转换为表格形式 描述 答案 前言 Python实际针对数据分析的学习是库,用库来解决一系列的数据分析问题 去掉信息不全的用户 描述 现有一个Nowcoder.csv文件,它记录了牛客网的部分用户数据,包含如下字段(字段与字段之间以逗号间隔): Nowcoder_ID:用户ID Level:等级 Achievement_value

随机推荐