await只是Python Asyncio中create_任务的一个语法糖吗?

await只是Python Asyncio中create_任务的一个语法糖吗?,python,python-asyncio,Python,Python Asyncio,Hi给出了以下示例: 我的问题是,例如,如果await语句只是一个语法糖 c = await <coro>() c=wait() 实际上相当于 _c = asyncio.create_task(<coro>()) c = _c.result \u c=asyncio.create\u任务(()) c=_c.结果 发动机罩下?它们不是等效的 等待 result=等待等待的对象 挂起协同路由,直到等待的\u对象完成,然后返回其结果,或引发将被传播的异常。有三种主要类

Hi给出了以下示例:

我的问题是,例如,如果
await
语句只是一个语法糖

c = await <coro>()
c=wait()
实际上相当于

_c = asyncio.create_task(<coro>())
c = _c.result
\u c=asyncio.create\u任务(())
c=_c.结果

发动机罩下?

它们不是等效的

等待
result=等待等待的对象

挂起协同路由,直到
等待的\u对象完成,然后返回其结果,或引发将被传播的异常。有三种主要类型的等待对象:协同程序任务,以及未来
await
表达式仅在
async def
中有效,简单地说,它同步运行协同程序或任务

创建任务
asyncio.create_任务(coro,*,name=None)
coro
coroutine包装到
任务中
,并很快安排其执行。返回任务对象。它不会暂停当前代码的执行,也不会返回任务的结果
create_task
可以在
async def
corroutines和普通
def
函数中调用

简单地说,
create_task
不会立即执行任务,也不会等待其结果,只会在不久的将来安排其执行

Task.result()

返回任务的结果。 如果
任务
完成,则返回包装的协同路由的结果(或者如果协同路由引发异常,则重新引发该异常) 如果任务的结果不可用,此方法将引发InvalidStateError异常


它们并不等同

等待
result=等待等待的对象

挂起协同路由,直到
等待的\u对象完成,然后返回其结果,或引发将被传播的异常。有三种主要类型的等待对象:协同程序任务,以及未来
await
表达式仅在
async def
中有效,简单地说,它同步运行协同程序或任务

创建任务
asyncio.create_任务(coro,*,name=None)
coro
coroutine包装到
任务中
,并很快安排其执行。返回任务对象。它不会暂停当前代码的执行,也不会返回任务的结果
create_task
可以在
async def
corroutines和普通
def
函数中调用

简单地说,
create_task
不会立即执行任务,也不会等待其结果,只会在不久的将来安排其执行

Task.result()

返回任务的结果。 如果
任务
完成,则返回包装的协同路由的结果(或者如果协同路由引发异常,则重新引发该异常) 如果任务的结果不可用,此方法将引发InvalidStateError异常


create_task
使用事件循环调度某个任务,使其有资格在下次等待(或完成)某个任务时运行<代码>等待
立即运行某些操作。您看到的行为特别是因为您使用的是jupyter笔记本。@Adam.Er8混乱是由OP在jupyter下运行代码引起的,该代码与GUI并行运行事件循环。在该环境中,键入
task=asyncio.create\u task(some\u coroutine())
,用户一按enter键,创建的任务就会被运行整个时间的事件循环拾取,并立即执行。这就是为什么下一行中的
task.result()
提供了一个结果,而不是提出
InvalidStateError
,正如您正确指出的那样。@Adam.Er8这导致OP得出结论认为
wait x
只是
的语法糖
紧跟其后的是
\u tmp。结果
在下一行。但是如果他们在Jupyter之外运行代码,或者只是将两个命令合并到一行(
\u tmp=create\u task(x);\u tmp.result
),它将不再工作。@user4815162342哦,哇,我没有意识到它是这样工作的,删除我的注释,因为它可能会误导人。谢谢你的澄清@Adam.Er8我想我的观点是,你的评论事实上是正确的——只是不在Jupyter交互环境的(非常具体的)上下文中。
create_task
使用事件循环调度某些内容,使其有资格在下次等待(或完成)某些内容时运行<代码>等待
立即运行某些操作。您看到的行为特别是因为您使用的是jupyter笔记本。@Adam.Er8混乱是由OP在jupyter下运行代码引起的,该代码与GUI并行运行事件循环。在该环境中,键入
task=asyncio.create\u task(some\u coroutine())
,用户一按enter键,创建的任务就会被运行整个时间的事件循环拾取,并立即执行。这就是为什么下一行中的
task.result()
提供了一个结果,而不是提出
InvalidStateError
,正如您正确指出的那样。@Adam.Er8这导致OP得出结论认为
wait x
只是
的语法糖
紧跟其后的是
\u tmp。结果
在下一行。但是如果他们在Jupyter之外运行代码,或者只是将两个命令合并到一行(
\u tmp=create\u task(x);\u tmp.result
),它将不再工作。@user4815162342哦,哇,我没有意识到它是这样工作的,删除我的注释,因为它可能会误导人。谢谢你的澄清