如果有的话,native
和基于 generator
的协程之间没有功能差异(除了语法);为什么 Python3
两者都有?我了解什么是基于生成器的协程。
是否有特定的设计决定或想法让两者兼而有之?
此外,我在这里有点困惑;生成器和协程之间的区别在于我无法写入 generator
;这个PEP添加了这样做的能力。我想在 python 中两者之间没有区别? (我还假设写入协程和向协程发送值是一回事)
为什么 asyncio
支持两者的使用?
最佳答案
在 3.5 之前,生成器和协程之间没有真正的区别。生成器 是一个纯粹使用 yield
作为表达式并通过 send()
期待数据的协程。
新的 async
syntax 改变了这种类型添加到 Python 3.5。 async
语法既是语法糖(在您的代码中将生成器可视化为异步协程),又是语言的扩展,可以将协程用作上下文管理器和可迭代对象(async with
和 async 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()
作为生成器。但是生成器不是等待的,不希望合作。
asyncio
必须支持两者,因为该库旨在与 Python 版本 < 3.5 兼容,因此不能依赖新的语言结构。
关于python - 为什么Python3.5有generator based co-routines?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39748849/