为什么在调用异步函数之前会打印该函数的输出?

问题描述 投票:0回答:1

异步函数的行为是不同的,尽管它们几乎是相同的代码,但我不明白为什么。

我的代码是:

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 开始较晚?

python python-3.x async-await python-asyncio sleep
1个回答
0
投票

无论您如何将

time
变成
func2
,开始
func1
func2
的方式之间显然存在差异:

    asyncio.create_task(func1())
    await func2()

您创建任务,然后立即等待

func2
。然后,当
func2
进入睡眠状态时,
func1
有机会启动,并且也进入睡眠状态。

如果

func2
发现
time == 1
,它会在一秒后唤醒并打印,然后
func1
唤醒,只晚了一小部分。

如果

func2
发现
time == 2
,它只会在两秒后醒来,而
func1
会先于它醒来。

我觉得这回答了你的问题,但不清楚为什么这令人惊讶?

© www.soinside.com 2019 - 2024. All rights reserved.