[英]Why are generator-based coroutines consumes, asynchronous generators asynchronous data producers, and coroutines asynchronous data consumers?
来自Jim Fasarakis Hilliard 的评论 :
生成器:包含一个或多个
yield
表达式的def
函数。生成器用作数据生成器(它们
yield
值)。
我能理解。
基于生成器的协同程序:由
types.coroutine
包装的生成器(def
+yield
)。 如果需要将它包含在coroutine对象中,则需要将其包装在types.coroutine
。基于生成器的协同程序作为消费者(你
.send
值,他们或子发电机他们yield from
)。
什么是“消费者(你.send
值,他们或子发电机他们yield from
)”是什么意思?
异步生成器:包含一个或多个
yield
表达式的async def
函数。 这些也可以包含await
表达式。异步生成器是异步数据生成器。
“异步数据生成器”是什么意思?
协程:没有零或更多的
async def
await
s和没有yield
s。协同程序是异步数据使用者 。
“异步数据消费者”是什么意思?
谢谢。
在python中,生成器现在以各种方式使用。 发电机的最初目的是中止执行,然后yield
的值返回给调用者 。 然后呼叫者可以稍后呼叫以恢复发电机。 因此发电机是数据生产者。
现在,上述版本的生成器只允许通过yield
语句返回数据。 现在,为了使一个函数成为一个协程,它也应该接受来自调用者的值。 因此,在python 2.5中引入了PEP 342来增强生成器,使它们可以充当完整的协同程序 。 这允许调用者将值发送到生成器。
现在新问题是,当生成器被重构并且您想将其操作的一部分委托给子生成器时,您需要显式调用子生成器作为迭代器,传播调用者发送的数据并处理异常。 为了简化子发电机的操作, 在PEP 380中定义了一个新的操作yield from
作为python 3.3的一部分 。 yield from
语法上来说, yield from
远远超过普通收益率语法。 在完美的世界中,可能会使用新的关键字。
现在的问题是发电机在两种不同的环境中使用。 作为迭代器和协程。 如果可以将生成器明确定义为协程,那会更好。 因此, PEP 492在Python 3.5中引入了async
和await
关键字。 因此,任何用作协程的生成器都由async
关键字指示。 Python 3.5中的协程可以使用await
关键字而不是yield from
。 请注意,从python 3.5开始,协同程序是一个不同的类型!
现在假设你有一个def
和yield
的生成器函数。 您可以使用types.coroutine
装饰器将现有生成器类型转换为coroutine类型。 这些消费者可以通过send()
接受值,并使用yield from
将其委托给子生成器。
在python 3.5中,您可以使用async
来指示该函数是协程类型。 这样的函数可以包含普通的yield
和await
。 它们不能包含yield from
(因为await
替换该功能)。 当协程包含普通yield
,它们是生成器调用链中最低的,因此称为异步数据生成器。
任何没有普通yield
协程都将成为数据使用者,因为它必须通过await
来调用另一个协程来获取异步数据。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.