从编写过 asyncio 代码但希望更好地理解内部工作原理的人的角度来看,什么是yield from
, await
这些对于允许异步代码有何用处?
有一个高度评价 https://stackoverflow.com/questions/9708902/in-practice-what-are-the-main-uses-for-the-new-yield-from-syntax-in-python-3询问有关用途的问题yield from
语法和解释 async 和 wait 的一个 https://stackoverflow.com/questions/31291129/pep-0492-python-3-5-async-keyword,但两者都深入讨论了不同的主题,并不是对底层代码及其如何与 asyncio 相结合的真正简洁解释。
简短回答:
yield from
是等待 asyncio 协程的一种旧方法。
await
是等待 asyncio 协程的现代方式。
详细解答:
Python 有生成器——一种特殊的函数,可以生成一系列结果而不是单个值。从 Python 3.3 开始yield from
添加了表达式。它allows https://docs.python.org/3/whatsnew/3.3.html#pep-380一个生成器将其部分操作委托给另一个生成器。
从 Python 3.4 开始asyncio
模块已添加到标准库中。它使我们能够编写清晰易懂的异步代码。虽然从技术上讲 asyncio 的协程可以以不同的方式实现,但asyncio
它们是使用生成器实现的(您可以观看优秀的视频 https://www.youtube.com/watch?v=MCs5OvhV9S4其中显示了如何使用生成器来实现协程)。@asyncio.coroutine
是一种从生成器制作协程的方法yield from
是一种等待协程的方法 - 只是实现的细节。
事情就是这样发生的yield from
开始用于两种“不同的事物”。
从 Python 3.5 开始(请参阅PEP 492 https://www.python.org/dev/peps/pep-0492/) 协程有了新的语法。现在你可以定义协程async def
并等待它使用await
表达。它不仅写起来更短,而且可以更清楚地理解我们使用 asyncio 的协程。
如果您使用的是 Python 3.5+,您可以忘记使用yield from
用于 asyncio 的协程并使用await
for it.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)