动动发财的小手,点个赞吧!
生成器是 Python 的根本组成部分。生成器是一个至多有一个“yield”表达式的函数。它们是能够暂停和复原的函数,就像协程一样。

实际上,Python 协程是 Python 生成器的扩大。Asyncio 容许咱们开发异步生成器。咱们能够通过定义一个应用“yield”表达式的协程来创立一个异步生成器。

1. 什么是异步生成器

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

1.1. Generators

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

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

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

从技术上讲,生成器函数创立并返回一个生成器迭代器。生成器迭代器执行生成器函数的内容,依据须要产生和复原。

能够应用内置函数 next() 分步执行生成器。

...# create the generatorgen = generator()# step the generatorresult = next(gen)

尽管,更常见的是迭代生成器直到实现,例如应用 for 循环或列表了解。

...# traverse the generator and collect resultsresults = [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 generatorasync def async_generator():    for i in range(10)        yield i

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

# define an asynchronous generator that awaitsasync 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 iteratorit = async_generator()

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

2.3. 一步

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

后果是期待的可期待对象。

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

这能够一步实现。

...# step the async generatorresult = await anext(gen)

2.4. 遍历

还能够应用“async for”表达式在循环中遍历异步生成器,该表达式将主动期待循环的每次迭代。

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

咱们还能够应用带有“async for”表达式的异步列表了解来收集生成器的后果。

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

3. 异步生成器示例

咱们能够摸索如何应用“async for”表达式遍历异步生成器。

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

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

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

# SuperFastPython.com# example of asynchronous generator with async for loopimport asyncio # define an asynchronous generatorasync 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 coroutineasync def main():    # loop over async generator with async for loop    async for item in async_generator():        print(item) # execute the asyncio programasyncio.run(main())

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

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

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

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

0123456789

本文由mdnice多平台公布