你提出了三种不同的方案:没有await语句(两者都注释掉)

仅使用await task1(注释掉第二个)

仅使用await task2(第一个命令出来)

这是您的脚本;将task2上的睡眠时间延长一点,只是为了举例说明。在# tasktest.py

import time

import asyncio

async def say_after(delay, what):

await asyncio.sleep(delay)

print(what)

async def main():

task1 = asyncio.create_task(

say_after(1, 'hello'))

task2 = asyncio.create_task(

say_after(3, 'world'))

print('started at', time.strftime('%X'))

await task1

# await task2

print('finished at', time.strftime('%X'))

asyncio.run(main())

1。没有await语句

这是^{}的肉:

^{pr2}$

重要的是,循环仅关心main()是否完成,然后取消与正在运行的事件循环关联的所有其他任务。(每个任务在指定时是tied to一个事件循环。)

如果定义main()而不使用任何await语句,create_task()将调度要执行的任务,但main()不会等待其中任何一个语句完成。在

2。await task1

设置:await task1

# await task2

输出:(base_py37) $ python3 tasktest.py

started at 11:06:46

hello

finished at 11:06:47

这两个任务都从挂起转移到正在运行,但只有task1完成,因为main()只等待一个耗时约1秒的任务,时间不足以让task2运行。*(注意,main()只需1秒)

3。await task2

设置:# await task1

await task2

输出:(base_py37) $ python3 tasktest.py

started at 11:08:37

hello

world

finished at 11:08:40

这两个任务都从挂起转移到正在运行,现在task1和task2都完成了,因为main()等待的任务耗时~3秒,足够两个任务运行到完成。在

*这至少适用于我的设置(Mac OSX,…),但正如这里的另一个答案中所提到的,在另一个设置中,时间可能会不同,如果任务运行时间相似,则两者都可能在案例2中运行。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐