关于程序员:Python-异步-异步生成器16

41次阅读

共计 2771 个字符,预计需要花费 7 分钟才能阅读完成。

动动发财的小手,点个赞吧!
生成器是 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

本文由 mdnice 多平台公布

正文完
 0