基于生成器的协程与本地协程

时间:2015-09-15 09:33:41

标签: python async-await coroutine python-3.5

我刚刚阅读了PEP0492谈论协同程序的新方法,但是PEP未能让我理解基于生成器的协程与本地协程之间的区别。有人可以告诉我差异(可能有例子)吗?

根据我的理解,他们使用不同的单词(产量/收益率和等待/ async / yield)。据我所知,在本地协程结束时,预计会产生收益,但对于基于生成器的协同处理也是如此。

3 个答案:

答案 0 :(得分:5)

扩展Mike S写的内容:CPython中的本地协同程序与生成器共享大部分相同的代码,因此功能上的差异很小。但是,我认为PEP-492超过了只是"语法糖的阈值"。生成器和本地协同程序有不同的用途,因此新语法阐明了作者的意图,并且可以执行旧语法无法做到的事情。以下是一些例子:

  • 生成器是可迭代的,而原生协程不是。
  • 本地协程还允许新的语法,如异步上下文管理器和异步迭代器。
  • 协同程序具有有用的调试信息,例如如果您从未await使用协程对象,则会发出警告。

新语法也很好地反映了asyncio库,并且类似于其他语言中使用的关键字。

答案 1 :(得分:1)

没有功能的区别。 "原生协同程序"使用asyncawait关键字只是先前在"基于生成器的协程中实现的语法糖。"

如果不需要支持较旧的Python版本,建议在3.5 docs 中使用asyncawait

答案 2 :(得分:0)

好吧,传统上编写协同程序的方法涉及回调。尽管最初回调可能很方便,但在我看来,它们会导致高度复杂和复杂的代码,至少可以说是pythonic。此外,yield(特别是yield from,因为python 3.3),使得协程实现更容易和pythonic。

使用生成器,您可以轻松地将代码划分为初始部分和回调。

@asyncio.coroutine
def print_sum(x, y):
    result = yield from compute(x, y)

    #write callback code
    print("%s + %s = %s" % (x, y, result))