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

29 浏览
0 Comments

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

从一个编写过 asyncio 代码但想更好地理解其内部工作原理的人的角度来看,yield fromawait 是什么,它们如何有助于允许异步代码?

有一个 高赞 的问题询问 yield from 语法的用途以及一篇 解释 async 和 await 的文章,但两者都深入探讨了不同的主题,而且并没有对底层代码及其与 asyncio 的关系进行简明扼要的解释。

admin 更改状态以发布 2023年5月22日
0
0 Comments

简短回答:

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),协程获得了新语法。现在,您可以使用 async def 定义协程,并使用 await 表达式等待它。这不仅更短,而且更清晰地表明我们正在使用 asyncio 的协程。

如果您使用的是 Python 3.5+,则可以忘记使用 yield from 等待 asyncio 的协程,并使用 await 代替。

0