Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 什么是;收益来自;asyncio中的语法是什么?它与;等待“;_Python_Async Await_Generator_Python Asyncio_Coroutine - Fatal编程技术网

Python 什么是;收益来自;asyncio中的语法是什么?它与;等待“;

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

从编写过异步IO代码但希望更好地理解内部工作原理的人的角度来看,
中获得的收益是什么,
等待
,以及这些对于允许异步代码有何用处


有一个问题是关于
语法和的使用,但这两个问题都深入讨论了不同的主题,并不是对底层代码及其如何与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时真正想到的。@Jay
wait
(以及它的旧版本
)将“阻止”本地执行流而不阻止事件循环。要在不阻止本地执行流的情况下运行任务,您需要创建asyncio的任务-。