如果有的话,native和基于generator的协同例程之间没有功能差异(除了语法);为什么Python3两者都有呢?我明白什么是以发电机为基础的联合例程。
是否有一个特定的设计决策或想法,使两者都有意义?
另外,我在这里有点困惑;生成器和协同例程之间的区别是我不能写入generator;这个佩普增加了这样的能力。我想这两者在蟒蛇身上没有区别吧?(我还假设,写入一个共同例程并将一个值发送给一个共同例程是一回事)
为什么asyncio支持两者的使用?
发布于 2016-09-28 13:58:32
在3.5之前,发电机和联合程序之间没有真正的区别.生成器是一个共同例程,完全通过使用yield作为表达式,并通过send()期待数据。
随着新的语法添加到Python3.5中,这种类型发生了变化。async语法既是语法糖(在代码中将生成器可视化地转换为异步协同),也是对语言的扩展,以便能够将协同作为上下文管理器和迭代器(async with和async for)使用。
引用PEP的话:
建议在Python中使coroutines成为一个适当的独立概念,并引入新的支持语法。最终目标是帮助建立一个通用的、易于接近的、使用Python进行异步编程的头脑模型,并使其尽可能接近同步编程。
在引擎盖下,共例程基本上仍然是发电机和发电机支持的大部分相同的功能.但是,为了使显式测试可访问对象成为可能,现在协同例程是一种不同的类型,请参阅第24400期中的动机(最初这是一个每个实例的标志,而不是一个不同的类型)。
要明确的是,您仍然可以使用.send()作为生成器。但是一个发电机是不可能的,它是不会合作的。
asyncio必须同时支持这两种语言,因为库的目标是与Python < 3.5兼容,因此不能依赖可用的新语言结构。
https://stackoverflow.com/questions/39748849
复制相似问题