在Python中,异步生成器函数是协同程序,生成器函数也是协同程序。
生成器函数和异步生成器函数的用途有什么区别?
感谢。
答案 0 :(得分:3)
PEP 525 -- Asynchronous Generators的目的与引入生成器的PEP 255 -- Simple Generators非常相似。它主要是为了让更容易实现,只在不同的域(异步域)中实现。从PEP 525开始:
基本上,适用于异步执行案例的PEP 255的目标和基本原理也适用于此提案。
简而言之,它使编写支持asynchronous iteration protocol的对象变得容易。正如 generator 为迭代器协议所做的那样。
您不必定义实现__aiter__
和__anext__
的对象,而是创建一个异步生成器,通过魔术来实现这一点。这反映了生成器为迭代器协议所做的事情;而不是为对象实现__iter__
和__next__
,您可以创建一个生成器。
在PEP 525的理性中很好地说明了这一点,其中还包括一个很好的例子,它显示了在使用异步生成器时编写的代码所节省的成本。
除了节省代码长度之外,异步生成器的性能也更好:
性能是此提议的另一个要点:在我们对参考实现的测试中,异步生成器比作为异步迭代器实现的等效生成器快2倍。
这里只是添加一些术语,因为它有时难以跟踪术语:
def
包含一个或多个yield
表达式的函数。types.coroutine
包装的生成器(def
+ yield
)。如果需要将它作为协程对象,则需要将其包装在types.coroutine
中。async def
表达式的yield
函数。这些也可以包含await
个表达式。async def
没有{0}个await
且没有yield
s。