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

时间:2016-09-28 13:23:36

标签: python generator python-asyncio coroutine

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

是否有一个特定的设计决策或想法,两者都有意义?

另外,我在这里有点困惑;生成器和协同例程之间的区别在于我无法写入generator;这个PEP增加了这样做的能力。我猜在python中两者之间没有差异? (我也假设写入一个共同例程并将值发送到一个协同例程是同样的事情)

为什么asyncio支持同时使用?

1 个答案:

答案 0 :(得分:4)

在3.5之前,生成器和协同例程之间没有真正的区别。生成器 是纯粹使用yield作为表达式并通过send()期望数据的协同例程。

随着新的async syntax添加到Python 3.5中,这种情况发生了变化。 async语法既是语法糖(在代码中可视化地将生成器转换为异步协同程序),也是语言的扩展,可以将协同程序用作上下文管理器和迭代(async with和{{1 }})。

引用PEP:

  

建议在Python中使 coroutines 成为一个合适的独立概念,并引入新的支持语法。最终目标是帮助在Python中建立一个通用的,易于接近的异步编程心理模型,并使其尽可能接近同步编程。

在引擎盖下,协同例程基本上仍然是发电机和发电机支持大多数相同的功能。协同例程现在是一个独特的类型,但是为了能够明确地测试等待的对象,请参阅issue 24400的动机(最初这是一个每个实例的标志,而不是一个独特的类型)。

要清楚,您仍然可以使用async for一个生成器。但是生成器不是等待,它不是期望的合作。

.send()必须支持这两者,因为该库旨在与Python版本兼容< 3.5因此无法依赖新的语言结构。