为什么 `await asyncio.create_task()` 的行为与将其分配给变量时的行为不同?
Why does `await asyncio.create_task()` behave different then when assigning it to a variable?
为什么下面代码中的任务 1-3 和 4-6 之间的任务 运行 不同?
代码:
import asyncio
async def do_something(i, sleep): # No I/O here
print("Doing... ", end="")
print(await no_io_1(i, sleep))
async def no_io_1(i, sleep): # No I/O here
return await no_io_2(i, sleep)
async def no_io_2(i, sleep): # No I/O here
return await io(i, sleep)
async def io(i, sleep):
await asyncio.sleep(sleep) # Finally some I/O
# t = asyncio.create_task(asyncio.sleep(sleep))
# await t
return i
async def main():
await asyncio.create_task(do_something(1, sleep=4))
await asyncio.create_task(do_something(2, sleep=3))
await asyncio.create_task(do_something(3, sleep=2))
t4 = asyncio.create_task(do_something(4, sleep=4))
t5 = asyncio.create_task(do_something(5, sleep=3))
t6 = asyncio.create_task(do_something(6, sleep=2))
await t4
await t5
await t6
asyncio.run(main())
print("\r\nBye!")
输出:
Doing... 1
Doing... 2
Doing... 3
Doing... Doing... Doing... 6
5
4
在第一个片段中,您立即等待您创建的每个任务。因此,任务无法 运行 并行执行。
在第二个片段中,您创建了三个任务,然后才开始等待。这允许所有三个并行 运行,尽管您的 await
指定您对第一个的结果感兴趣。能够 运行 在等待特定任务的结果的同时执行其他任务对于像 asyncio 这样的库来说是必不可少的。
换句话说,await t1
并不意味着“运行 t1
”,它意味着“挂起我并旋转事件循环直到 t1
完成” .区别与存储在变量中的任务无关,而是与提前创建任务有关。例如,您可以这样修改第二个示例:
t4 = asyncio.create_task(do_something(4, sleep=4))
await t4
t5 = asyncio.create_task(do_something(5, sleep=3))
await t5
t6 = asyncio.create_task(do_something(6, sleep=2))
await t6
...您会得到与第一个示例类似的行为。
为什么下面代码中的任务 1-3 和 4-6 之间的任务 运行 不同?
代码:
import asyncio
async def do_something(i, sleep): # No I/O here
print("Doing... ", end="")
print(await no_io_1(i, sleep))
async def no_io_1(i, sleep): # No I/O here
return await no_io_2(i, sleep)
async def no_io_2(i, sleep): # No I/O here
return await io(i, sleep)
async def io(i, sleep):
await asyncio.sleep(sleep) # Finally some I/O
# t = asyncio.create_task(asyncio.sleep(sleep))
# await t
return i
async def main():
await asyncio.create_task(do_something(1, sleep=4))
await asyncio.create_task(do_something(2, sleep=3))
await asyncio.create_task(do_something(3, sleep=2))
t4 = asyncio.create_task(do_something(4, sleep=4))
t5 = asyncio.create_task(do_something(5, sleep=3))
t6 = asyncio.create_task(do_something(6, sleep=2))
await t4
await t5
await t6
asyncio.run(main())
print("\r\nBye!")
输出:
Doing... 1
Doing... 2
Doing... 3
Doing... Doing... Doing... 6
5
4
在第一个片段中,您立即等待您创建的每个任务。因此,任务无法 运行 并行执行。
在第二个片段中,您创建了三个任务,然后才开始等待。这允许所有三个并行 运行,尽管您的 await
指定您对第一个的结果感兴趣。能够 运行 在等待特定任务的结果的同时执行其他任务对于像 asyncio 这样的库来说是必不可少的。
换句话说,await t1
并不意味着“运行 t1
”,它意味着“挂起我并旋转事件循环直到 t1
完成” .区别与存储在变量中的任务无关,而是与提前创建任务有关。例如,您可以这样修改第二个示例:
t4 = asyncio.create_task(do_something(4, sleep=4))
await t4
t5 = asyncio.create_task(do_something(5, sleep=3))
await t5
t6 = asyncio.create_task(do_something(6, sleep=2))
await t6
...您会得到与第一个示例类似的行为。