生成器函数和异步生成器函数的目的之间有什么区别

时间:2017-09-13 17:47:44

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

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

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

感谢。

1 个答案:

答案 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个表达式。
  • Coroutine:async def没有{0}个await且没有yield s。