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

Kol*_*dar 7 python coroutine async-await python-3.5

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

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

Mar*_*ase 6

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

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

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


Mik*_*e S 4

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

如果不需要支持较旧的 Python 版本,则建议在3.5 文档中使用async和。await