异步函数的行为是不同的,尽管它们几乎是相同的代码,但我不明白为什么。
我的代码是:
import asyncio
async def func1():
await asyncio.sleep(1)
print("func1")
async def func2():
await asyncio.sleep(time)
print("func2")
async def func3():
await asyncio.sleep(3)
print("func3")
async def main():
asyncio.create_task(func1())
await func2()
await func3()
asyncio.run(main())
如果我输入
time = 1
那么输出是:
func2
func1
func3
但是如果
time = 2
那么输出是:
func1
func2
func3
在第一种情况下,为什么
func2
在 func1
之前打印,即使 func2 开始较晚?
无论您如何将
time
变成 func2
,开始 func1
和 func2
的方式之间显然存在差异:
asyncio.create_task(func1())
await func2()
您创建任务,然后立即等待
func2
。然后,当 func2
进入睡眠状态时,func1
有机会启动,并且也进入睡眠状态。
如果
func2
发现 time == 1
,它会在一秒后唤醒并打印,然后 func1
唤醒,只晚了一小部分。
如果
func2
发现time == 2
,它只会在两秒后醒来,而func1
会先于它醒来。
我觉得这回答了你的问题,但不清楚为什么这令人惊讶?