从已经编写了异步代码但希望更好地理解内部工作原理的人的角度来看,什么是yield from
、await
,以及它们对允许异步代码有什么用处?
有一个highly upvoted问题询问了yield from
语法和one explaining async and await的使用,但这两个问题都深入讨论了不同的主题,并没有真正简明地解释底层代码以及它是如何适应异步的。
发布于 2017-05-31 08:26:19
简短回答:
yield from
是一种等待asyncio的协程的旧方法。
await
是一种等待asyncio协程的现代方式。
详细答案:
Python有生成器,这是一种特殊类型的函数,可以生成一系列结果,而不是单个值。从Python3.3开始,添加了yield from
表达式。它allows一个生成器以将其部分操作委托给另一个生成器。
从Python3.4开始,asyncio
模块被添加到标准库中。它允许我们编写清晰且易于理解异步代码。虽然在技术上异步的协程可以以不同的方式实现,但在asyncio
中,它们是使用生成器实现的(您可以查看excellent video,其中展示了如何使用生成器来实现协程)。@asyncio.coroutine
是从生成器生成协程的一种方式,而yield from
是等待协程的一种方式--只是实现的细节。
这就是为什么yield from
开始被用于两个“不同的东西”。
从Python3.5(参见PEP 492)开始,协程有了新的语法。现在您可以使用async def
定义协程,并使用await
表达式等待它。它不仅写起来更短,而且让我们更清楚地理解我们使用的是asyncio的协程。
如果您正在使用Python,那么您可以忘记使用yield from
作为3.5+的协程,而使用await
来实现它。
https://stackoverflow.com/questions/44251045
复制相似问题