Python 什么是;收益来自;asyncio中的语法是什么?它与;等待“;
从编写过异步IO代码但希望更好地理解内部工作原理的人的角度来看,Python 什么是;收益来自;asyncio中的语法是什么?它与;等待“;,python,async-await,generator,python-asyncio,coroutine,Python,Async Await,Generator,Python Asyncio,Coroutine,从编写过异步IO代码但希望更好地理解内部工作原理的人的角度来看,从中获得的收益是什么,等待,以及这些对于允许异步代码有何用处 有一个问题是关于语法和的使用,但这两个问题都深入讨论了不同的主题,并不是对底层代码及其如何与asyncio配合的简明解释。简短回答: yield from是等待asyncio协同进程的一种老方法 wait是等待asyncio协同程序的一种现代方式 详细答案: Python有生成器——一种特殊的函数,它生成一系列结果而不是单个值。从Python3.3开始,添加了yield
从
中获得的收益是什么,等待
,以及这些对于允许异步代码有何用处
有一个问题是关于
语法和的使用,但这两个问题都深入讨论了不同的主题,并不是对底层代码及其如何与asyncio配合的简明解释。简短回答:
yield from
是等待asyncio协同进程的一种老方法
wait
是等待asyncio协同程序的一种现代方式
详细答案:
Python有生成器——一种特殊的函数,它生成一系列结果而不是单个值。从Python3.3开始,添加了
yield fromexpression。它允许一个生成器将其部分操作委托给另一个生成器
从Python 3.4开始,asyncio模块被添加到标准库中。它允许我们编写清晰易懂的异步代码。虽然从技术上讲,asyncio的协同路由可以以不同的方式实现,但在asyncio
中,它们是使用生成器实现的(您可以查看哪里显示了如何使用生成器实现协同路由)@asyncio.coroutine
是从生成器生成协同路由的一种方法,从
生成是等待协同路由的一种方法-只是实现的细节
这就是为什么从产生的收益开始被用于两个“不同的事情”的原因
从Python3.5开始(请参阅),协同程序得到了新的语法。现在,您可以使用async def
定义协同路由,并使用await
表达式等待它。这不仅缩短了编写时间,而且使我们更清楚地了解到我们使用asyncio的协程
如果您使用的是Python3.5+,那么您可以忘记使用yield from
作为asyncio的协同程序,而使用await
作为它。您链接的第二个问题似乎非常直接地解释了如何使用async
和await
更简洁地表达您过去的习惯需要从
和异步协同程序
中获得收益来表达。我想我不太确定这个问题是什么,因为这个例子似乎很好地解释了这个问题。你能说得更具体些吗?@mgilson它探讨了await
与收益率的关系,但实际上与收益率的作用无关。它们是一样的,只是await
更多,而且看起来更好,我希望我在浪费大量时间阅读来自和@asyncio.coroutine的收益之前读过这篇文章!然后我读了async def
和await
,然后我说“嗯,我想知道有什么不同”。我希望这一点在…“如果您使用的是Python 3.5+,那么您可以忘记将yield from用于除生成器之外的任何东西,而将wait用于协同路由。”@timgeb是的,您是对的:我的意思是仅异步协同路由。我将编辑答案。谢谢。“除了生成器”应该更明确一点,从技术上讲,def foo():x=yield
的实例属于generator
(出于历史原因),但通俗地说,它是一个“协同程序”,并不是人们在说generator时真正想到的。@Jaywait
(以及它的旧版本
)将“阻止”本地执行流而不阻止事件循环。要在不阻止本地执行流的情况下运行任务,您需要创建asyncio的任务-。