【问题标题】:What are the differences between the purposes of generator functions and asynchronous generator functions生成器函数和异步生成器函数的用途有什么区别
【发布时间】:2026-01-27 16:15:01
【问题描述】:

在 Python 中,异步生成器函数是协程,生成器函数也是协程。

生成器函数和异步生成器函数的用途有什么区别?

谢谢。

【问题讨论】:

  • CV-voter,如果问题太宽泛,我提供的长度的答案是不可能的。不要乱投票。

标签: python python-3.x asynchronous python-3.6 coroutine


【解决方案1】:

PEP 525 -- Asynchronous Generators 的目的与引入生成器的PEP 255 -- Simple Generators 非常相似。它主要是为了让事情更容易实现,只是在不同的领域(异步领域)。来自 PEP 525:

本质上,应用于异步执行案例的 PEP 255 的目标和基本原理也适用于该提案。

简而言之,它使编写支持asynchronous iteration protocol 的对象变得容易。正如 generatorsiterator 协议所做的那样。

您不必定义实现__aiter____anext__ 的对象,而是创建一个看似神奇的异步生成器。这反映了生成器为迭代器协议所做的事情;您可以只创建一个生成器,而不是为对象实现 __iter____next__

这在 PEP 525 的理性中得到了很好的说明,其中还包括一个很好的示例,该示例显示了您在使用异步生成器时编写的代码所节省的成本。

除了节省代码长度外,异步生成器的性能也更好:

性能是这个提议的一个附加点:在我们对参考实现的测试中,异步生成器比实现为异步迭代器的等效生成器快 2 倍。


只是在这里添加一些术语,因为有时很难跟踪术语:

  • 生成器:def 函数包含一个或多个 yield 表达式。
  • 基于生成器的协程:由types.coroutine 包装的生成器 (def + yield)。如果您需要将其视为协程对象,则需要将其包装在 types.coroutine 中。
  • 异步生成器:async def 函数包含一个或多个 yield 表达式。这些也可以包含await 表达式。
  • 协程:async def 没有零个或多个 awaits 也没有 yields。

【讨论】:

  • 谢谢。在“异步生成器:包含 yield 表达式的 async def 函数”中,您的意思是 await 而不是 yield
  • @Tim no no,如果你在async def 中只有一个await,你会得到一个协程。 yieldasync def 中的存在使其成为异步生成器:-)。
  • “异步生成器”、基于生成器的协程和生成器在用途方面有什么区别? (不仅仅是您所描述的定义方式)
  • @Tim 生成器用作数据生产者(它们产生值)。基于生成器的协程被用作消费者(您 .send 对它们或它们的子生成器 yield from 赋值)。异步生成器是异步数据生产者(而协程是异步数据消费者)。
  • 谢谢。我想知道您在上一条评论*.com/questions/46822070/… 中有关生产者和消费者的一些问题。我还想知道关于术语“基于生成器的协程”*.com/questions/46830144/… 的一些问题