Python 为什么“wait asyncio.create_task()”在将其分配给变量时的行为会有所不同?

Python 为什么“wait asyncio.create_task()”在将其分配给变量时的行为会有所不同?,python,python-3.x,python-asyncio,python-3.8,Python,Python 3.x,Python Asyncio,Python 3.8,为什么在下面的代码中,任务1-3和任务4-6之间的运行方式不同 代码: 导入异步IO 异步def do_something(i,sleep):#这里没有i/O 打印(“正在…”,end=“”) 打印(等待no_io_1(i,睡眠)) 异步定义无io(i,睡眠):#此处无i/O 返回等待no_io_2(i,睡眠) 异步定义无io 2(i,睡眠):#此处无i/O 返回等待io(i,睡眠) 异步定义io(i,睡眠): 等待asyncio.sleep(sleep)#最后一些I/O #t=asyncio.

为什么在下面的代码中,任务1-3和任务4-6之间的运行方式不同

代码:

导入异步IO
异步def do_something(i,sleep):#这里没有i/O
打印(“正在…”,end=“”)
打印(等待no_io_1(i,睡眠))
异步定义无io(i,睡眠):#此处无i/O
返回等待no_io_2(i,睡眠)
异步定义无io 2(i,睡眠):#此处无i/O
返回等待io(i,睡眠)
异步定义io(i,睡眠):
等待asyncio.sleep(sleep)#最后一些I/O
#t=asyncio.create_任务(asyncio.sleep(sleep))
#等待
返回i
异步def main():
等待asyncio。创建任务(做一些事情(1,sleep=4))
等待asyncio。创建任务(做点什么(2,sleep=3))
等待异步IO。创建任务(做一些事情(3,sleep=2))
t4=asyncio.create_任务(做点什么(4,sleep=4))
t5=asyncio.create_任务(做点什么(5,sleep=3))
t6=asyncio.create_任务(做点什么(6,sleep=2))
等待t4
等待t5
等待t6
asyncio.run(main())
打印(“\r\n字节!”)
输出:

Doing... 1
Doing... 2
Doing... 3
Doing... Doing... Doing... 6
5
4

在第一个代码片段中,您将立即等待您创建的每个任务。因此,任务无法并行运行

在第二个代码段中,您创建了三个任务,然后才开始等待。这允许所有三个并行运行,尽管您
wait
指定您对第一个的结果感兴趣。(能够在等待特定任务结果的同时运行其他任务是asyncio等库的核心设计目标。)

换句话说,
wait t1
并不意味着“运行
t1
”,它意味着“暂停我并旋转事件循环,直到
t1
完成”。区别与任务存储在变量中无关,而是与立即创建任务有关。例如,您可以这样修改第二个示例:

t4=asyncio.create_任务(做点什么(4,sleep=4))
等待t4
t5=asyncio.create_任务(做点什么(5,sleep=3))
等待t5
t6=asyncio.create_任务(做点什么(6,sleep=2))
等待t6

…您将获得与第一个示例类似的行为。

在第一个代码片段中,您将立即等待您创建的每个任务。因此,任务无法并行运行

在第二个代码段中,您创建了三个任务,然后才开始等待。这允许所有三个并行运行,尽管您
wait
指定您对第一个的结果感兴趣。(能够在等待特定任务结果的同时运行其他任务是asyncio等库的核心设计目标。)

换句话说,
wait t1
并不意味着“运行
t1
”,它意味着“暂停我并旋转事件循环,直到
t1
完成”。区别与任务存储在变量中无关,而是与立即创建任务有关。例如,您可以这样修改第二个示例:

t4=asyncio.create_任务(做点什么(4,sleep=4))
等待t4
t5=asyncio.create_任务(做点什么(5,sleep=3))
等待t5
t6=asyncio.create_任务(做点什么(6,sleep=2))
等待t6
…你会得到第一个例子的行为