从编写asyncio代码但希望更好地理解内部工作原理的人的角度来看,yield from
,await
以及那些对于允许异步代码有用的内容是什么?
有一个highly upvoted问题询问yield from
语法和one explaining async and await的用法,但两者都深入讨论了不同的主题,并不是对底层代码及其如何适应asyncio的简明解释。
简短回答:
qazxsw poi是一种等待asyncio协同程序的老方法。
qazxsw poi是一种等待asyncio协同程序的现代方式。
详细解答:
Python有生成器 - 一种特殊的函数,它产生一系列结果而不是单个值。从Python 3.3开始,添加了yield from
表达式。它await
一个生成器将其部分操作委托给另一个生成器。
从Python 3.4开始,yield from
模块被添加到标准库中。它允许我们编写清晰易懂的异步代码。虽然技术上asyncio的协同程序可以以不同的方式实现,但在allows中它们是使用生成器实现的(您可以在asyncio
中查看如何使用生成器来实现协同程序)。 asyncio
是一种从发电机制作协程的方法,excellent video是一种等待协程的方法 - 只是实施细节。
这就是@asyncio.coroutine
开始用于两个“不同的东西”的情况。
从Python 3.5开始(参见yield from
),coroutines获得了新的语法。现在你可以使用yield from
定义协同程序并使用PEP 492表达式等待它。它不仅写得更短,而且更清楚地理解我们使用asyncio的协同程序。
如果您使用的是Python 3.5+,则可以忘记将async def
用于asyncio的协程并使用await
。