【发布时间】:2026-01-27 16:15:01
【问题描述】:
在 Python 中,异步生成器函数是协程,生成器函数也是协程。
生成器函数和异步生成器函数的用途有什么区别?
谢谢。
【问题讨论】:
-
CV-voter,如果问题太宽泛,我提供的长度的答案是不可能的。不要乱投票。
标签: python python-3.x asynchronous python-3.6 coroutine
在 Python 中,异步生成器函数是协程,生成器函数也是协程。
生成器函数和异步生成器函数的用途有什么区别?
谢谢。
【问题讨论】:
标签: python python-3.x asynchronous python-3.6 coroutine
PEP 525 -- Asynchronous Generators 的目的与引入生成器的PEP 255 -- Simple Generators 非常相似。它主要是为了让事情更容易实现,只是在不同的领域(异步领域)。来自 PEP 525:
本质上,应用于异步执行案例的 PEP 255 的目标和基本原理也适用于该提案。
简而言之,它使编写支持asynchronous iteration protocol 的对象变得容易。正如 generators 对 iterator 协议所做的那样。
您不必定义实现__aiter__ 和__anext__ 的对象,而是创建一个看似神奇的异步生成器。这反映了生成器为迭代器协议所做的事情;您可以只创建一个生成器,而不是为对象实现 __iter__ 和 __next__。
这在 PEP 525 的理性中得到了很好的说明,其中还包括一个很好的示例,该示例显示了您在使用异步生成器时编写的代码所节省的成本。
除了节省代码长度外,异步生成器的性能也更好:
性能是这个提议的一个附加点:在我们对参考实现的测试中,异步生成器比实现为异步迭代器的等效生成器快 2 倍。
只是在这里添加一些术语,因为有时很难跟踪术语:
def 函数包含一个或多个 yield 表达式。types.coroutine 包装的生成器 (def + yield)。如果您需要将其视为协程对象,则需要将其包装在 types.coroutine 中。async def 函数包含一个或多个 yield 表达式。这些也可以包含await 表达式。async def 没有零个或多个 awaits 也没有 yields。【讨论】:
await 而不是 yield?
async def 中只有一个await,你会得到一个协程。 yield 在 async def 中的存在使其成为异步生成器:-)。
.send 对它们或它们的子生成器 yield from 赋值)。异步生成器是异步数据生产者(而协程是异步数据消费者)。