"yield from" 语法在 asyncio 中有什么作用,它与 "await" 有何不同

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

从编写过 asyncio 代码但希望更好地了解内部工作原理的人的角度来看,什么是 yield fromawait 以及它们对允许异步代码有何用处?

有一个 highly upvoted question asking about the uses of the yield from syntax and ,但两者都深入探讨了不同的主题,并不是对底层代码及其如何与 asyncio 相适应的简明解释。

简答:

yield from 是等待 asyncio 协程的老方法。

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

详细答案:

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

从 Python 3.4 asyncio 模块开始,已将模块添加到标准库中。它允许我们编写清晰易懂的异步代码。虽然从技术上讲,asyncio 的协程可以通过不同的方式实现,但在 asyncio 中,它们是使用生成器实现的(您可以观看 excellent video,其中显示了如何使用生成器来实现协程)。 @asyncio.coroutine 是一种从生成器生成协程的方法,yield from 是一种等待协程的方法——只是实现的细节。

这就是 yield from 开始用于两个 "different things" 的原因。

从 Python 3.5(参见 PEP 492)开始,协程有了新的语法。现在您可以使用 async def 定义协程并使用 await 表达式等待它。它不仅写起来更短,而且更清楚地理解我们使用 asyncio 的协程。

如果您使用的是 Python 3.5+,您可以忘记对 asyncio 的协程使用 yield from,而使用 await