我刚刚阅读了PEP0492谈论协同程序的新方法,但是PEP未能让我理解基于生成器的协程与本地协程之间的区别。有人可以告诉我差异(可能有例子)吗?
根据我的理解,他们使用不同的单词(产量/收益率和等待/ async / yield)。据我所知,在本地协程结束时,预计会产生收益,但对于基于生成器的协同处理也是如此。
答案 0 :(得分:5)
扩展Mike S写的内容:CPython中的本地协同程序与生成器共享大部分相同的代码,因此功能上的差异很小。但是,我认为PEP-492超过了只是"语法糖的阈值"。生成器和本地协同程序有不同的用途,因此新语法阐明了作者的意图,并且可以执行旧语法无法做到的事情。以下是一些例子:
await
使用协程对象,则会发出警告。新语法也很好地反映了asyncio
库,并且类似于其他语言中使用的关键字。
答案 1 :(得分:1)
没有功能的区别。 "原生协同程序"使用async
和await
关键字只是先前在"基于生成器的协程中实现的语法糖。"
如果不需要支持较旧的Python版本,建议在3.5 docs 中使用async
和await
。
答案 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))