关于python:“yield from”语法在asyncio中做了什么,它与“await”的区别是什么?

What does the “yield from” syntax do in asyncio and how is it different from “await”

从编写了异步代码但希望更好地理解内部工作的人的角度来看,yield fromawait是什么?这些对于允许异步代码有何帮助?

关于yield from语法的用法,有一个非常乐观的问题,一个解释async和await,但都深入讨论了不同的主题,并不是对底层代码以及它如何与asyncio相适应的一个简明解释。


简短回答:

yield from是等待asyncio协同工作的一种老方法。

await是等待asyncio协程的一种现代方式。

详细答案:

python有生成器——一种特殊的函数,它产生一系列结果而不是单个值。从python 3.3开始添加yield from表达式。它允许一个生成器将其部分操作委托给另一个生成器。

从python 3.4开始,asyncio模块被添加到标准库中。它允许我们编写清晰易懂的异步代码。虽然从技术上讲,Asyncio的协同程序可以以不同的方式实现,但在asyncio中,它们是使用生成器实现的(您可以观看演示如何使用生成器实现协同程序的优秀视频)。@asyncio.coroutine是一种从生成器中生成协程的方法,yield from是一种等待协程的方法——只是实现的细节。

这就是为什么yield from开始用于两个"不同的事物"。

从python 3.5(参见pep 492)开始,coroutines有了新的语法。现在可以用async def定义协同程序,并使用await表达式等待它。它不仅写得更短,而且更清楚地理解我们使用的是Asyncio的协程。

如果您使用的是python 3.5+,那么您可以忘记将yield from用于Asyncio的协程,并将await用于它。