生成器功能和异步生成器功能的用途有什么区别


问题内容

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

生成器功能和异步生成器功能的用途之间有什么区别?

谢谢。


问题答案:

PEP 525-异步发电机的用途与PEP
255-

引入发电机的简单发电机非常相似。它的主要目的是使事情仅在不同的域(异步域)中
更易于 实现。从PEP 525:

从本质上讲,适用于异步执行情况的PEP 255的目标和基本原理也适用于此建议。

简而言之,它使编写支持异步迭代协议的对象变得容易。正如 生成器迭代器协议 所做的那样。

而不必定义执行对象__aiter__,并__anext__创建一个异步发电机,通过魔法看似做到这一点。这反映了生成器为迭代器协议所做的工作;而不是实施__iter____next__一个对象,你可以创建一个发电机。

PEP 525的原理很好地说明了这一点,其中还包括一个不错的示例,该示例显示了使用异步生成器时在编写代码中节省的成本。

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

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


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

  • 生成器:def包含一个或多个yield表达式的函数。
  • 基于生成器的协程:由包裹的生成器(def+ yieldtypes.coroutine。如果需要将其types.coroutine视为协程对象,则需要将其包装。
  • 异步生成器:async def包含一个或多个yield表达式的函数。这些还可以包含await表达式。
  • 协程:async def不带零个或多个await且不带yields。