生成器功能和异步生成器功能的用途有什么区别
问题内容:
在Python中,异步生成器函数是协程,生成器函数也是协程。
生成器功能和异步生成器功能的用途之间有什么区别?
谢谢。
问题答案:
PEP 525-异步发电机的用途与PEP
255-
引入发电机的简单发电机非常相似。它的主要目的是使事情仅在不同的域(异步域)中
更易于 实现。从PEP 525:
从本质上讲,适用于异步执行情况的PEP 255的目标和基本原理也适用于此建议。
简而言之,它使编写支持异步迭代协议的对象变得容易。正如 生成器 为 迭代器协议 所做的那样。
而不必定义执行对象__aiter__
,并__anext__
创建一个异步发电机,通过魔法看似做到这一点。这反映了生成器为迭代器协议所做的工作;而不是实施__iter__
和__next__
一个对象,你可以创建一个发电机。
PEP 525的原理很好地说明了这一点,其中还包括一个不错的示例,该示例显示了使用异步生成器时在编写代码中节省的成本。
除了节省代码长度之外,异步生成器的性能也更好:
性能是此建议的另一个要点:在我们对参考实现的测试中,异步生成器比等效实现为异步迭代器快2倍。
只是在此处添加一些术语,因为有时很难跟踪术语:
- 生成器:
def
包含一个或多个yield
表达式的函数。 - 基于生成器的协程:由包裹的生成器(
def
+yield
)types.coroutine
。如果需要将其types.coroutine
视为协程对象,则需要将其包装。 - 异步生成器:
async def
包含一个或多个yield
表达式的函数。这些还可以包含await
表达式。 - 协程:
async def
不带零个或多个await
且不带yield
s。