为什么 Python3.5 有基于生成器的协程?

Why does Python3.5 have generator based co-routines?

如果有的话,基于 nativegenerator 的协同例程之间没有功能差异(除了语法);为什么 Python3 两者都有?我了解什么是基于生成器的协程。

是否有特定的设计决定或想法使两者都有意义?

另外,我在这里有点困惑;生成器和协程之间的区别在于我无法写入 generator;这个 PEP 添加了这样做的能力。我想 python 两者之间没有区别? (我还假设写入协程和向协程发送值是一回事)

为什么 asyncio 支持两者的使用?

在 3.5 之前,生成器和协程之间没有真正的区别。一个生成器 一个纯粹使用 yield 作为表达式并通过 send().

期望数据的协程

随着新的 async syntax 添加到 Python 3.5,这种情况发生了变化。 async 语法既是语法糖(在您的代码中将生成器直观地转换为异步协程),又是该语言的扩展,可以将协程用作上下文管理器和可迭代对象(async withasync for).

引用 PEP:

It is proposed to make coroutines a proper standalone concept in Python, and introduce new supporting syntax. The ultimate goal is to help establish a common, easily approachable, mental model of asynchronous programming in Python and make it as close to synchronous programming as possible.

在幕后,协程基本上仍然是生成器,生成器支持大部分相同的功能。协程现在是一种独特的类型,但是为了能够显式测试等待对象,请参阅 issue 24400 了解动机(最初这是一个实例标志,而不是独特的类型)。

需要说明的是,您仍然可以使用 .send() 生成器。但是生成器不是awaitable,它不是expected合作的。

asyncio 必须支持两者,因为该库旨在与 Python 版本 < 3.5 兼容,因此不能依赖新的语言结构。