python - 为什么Python3.5有generator based co-routines?

标签 python generator python-asyncio coroutine

如果有的话,native 和基于 generator 的协程之间没有功能差异(除了语法);为什么 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() 作为生成器。但是生成器不是等待的,不希望合作。

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

关于python - 为什么Python3.5有generator based co-routines?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39748849/

相关文章:

python - 图形显示窗口保持隐藏状态

python - 正则表达式匹配变量并从python中的匹配行获取引号内的单词

python - functools.partial 和生成器

python - Keras适合生成器-ValueError : Failed to find data adapter that can handle input

python - 多处理 : optimize CPU usage for concurrent HTTP async requests

python - 在Python代码中多次运行asyncio.run有什么缺点?

Python 输入 : Retrieve required keys from TypedDict definition

python - 在 Jenkins 中设置特定的 Python

javascript - 是否可以将生成器中的项目异步收集到数组中?

python - 如何用aioredis pub/sub实现单生产者多消费者