2017-09-13 64 views
1

在Python中,异步发电机功能是协同程序,发电机功能也是协同程序。发电机功能和异步发电机功能的区别是什么

发电机功能和异步发电机功能的目的有什么区别?

谢谢。

+1

简历选民,如果问题太广泛,我提供的长度的答案将是不可能的。不要胡乱投票。 –

回答

2

PEP 525 -- Asynchronous Generators的用途与引入生成器的PEP 255 -- Simple Generators非常相似。它主要是为了使更简单来实现,只在不同的域(异步)。从PEP 525开始:

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

简而言之,它使写作对象容易支持asynchronous iteration protocol。由于发生器做了迭代器协议

而不是必须定义实现__aiter____anext__的对象,而是创建一个异步生成器,这看起来像是通过魔术来实现的。这反映了发生器为迭代器协议所做的事情;而不是为一个对象实现__iter____next__,您可以创建一个生成器。

这在PEP 525的理性中很好地陈述了,它还包含一个很好的示例,显示了使用异步生成器编写代码时所节省的成本。

除了码长的储蓄,异步发电机也执行好得多:

性能是本提案补充一点:在我们的参考实现的测试,异步发电机的2倍比实现同等更快作为异步迭代器。


就在这里补充一些术语,因为它越来越难以跟上方面的跟踪有时:

  • 发电机:包含一个或多个yield表达式def功能。
  • 基于生成器的协同程序:由types.coroutine包装的生成器(def + yield)。如果需要将其包含在协同对象中,则需要将其包装在types.coroutine中。
  • 异步生成器:async def包含一个或多个yield表达式的函数。这些还可以包含await表达式。
  • 协同程序:async def没有零个或多个await s和没有yield s。
+0

谢谢。在“异步生成器:包含yield表达式的async def函数”中,你的意思是'await'而不是'yield'? – Tim

+0

@Tim不,如果你只在'async def'中有'await',你会得到一个协程。 'async def'中'yield'的存在使得它成为一个异步生成器:-)。 –

+0

“Asynchronous Generator”,基于发生器的协同程序和发生器在它们的用途方面有什么区别? (不仅仅是你如何定义你描述的内容) – Tim