"yield from" 语法在 asyncio 中有什么作用,它与 "await" 有何不同。
"yield from" 语法在 asyncio 中有什么作用,它与 "await" 有何不同。
从一个编写过 asyncio 代码但想更好地理解其内部工作原理的人的角度来看,yield from
,await
是什么,它们如何有助于允许异步代码?
有一个 高赞 的问题询问 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),协程获得了新语法。现在,您可以使用 async def
定义协程,并使用 await
表达式等待它。这不仅更短,而且更清晰地表明我们正在使用 asyncio 的协程。
如果您使用的是 Python 3.5+,则可以忘记使用 yield from
等待 asyncio 的协程,并使用 await
代替。