繁体   English   中英

为什么基于生成器的协同程序消耗,异步生成器异步数据生成器和协同程序异步数据使用者?

[英]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中引入了asyncawait关键字。 因此,任何用作协程的生成器都由async关键字指示。 Python 3.5中的协程可以使用await关键字而不是yield from 请注意,从python 3.5开始,协同程序是一个不同的类型!

现在假设你有一个defyield的生成器函数。 您可以使用types.coroutine装饰器将现有生成器类型转换为coroutine类型。 这些消费者可以通过send()接受值,并使用yield from将其委托给子生成器。

在python 3.5中,您可以使用async来指示该函数是协程类型。 这样的函数可以包含普通的yieldawait 它们不能包含yield from (因为await替换该功能)。 当协程包含普通yield ,它们是生成器调用链中最低的,因此称为异步数据生成器。

任何没有普通yield协程都将成为数据使用者,因为它必须通过await来调用另一个协程来获取异步数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM