异步事件循环执行会阻塞代码之间的等待吗?

时间:2020-10-09 05:03:11

标签: python-3.x python-asyncio

我不明白为什么在此代码段中,在2个await任务之间插入打印语句后,仅在两个await语句都已执行之后才执行此打印语句。我期望打印语句在两个await之前显示。

我想这是由于事件循环的实现造成的。请问两次等待之间是否发生了特殊情况?

import asyncio
import time

async def say_after(delay, what):
    await asyncio.sleep(delay)
    print(what)


async def mainex():
    task1 = asyncio.create_task(
                say_after(4, 'hello'))

    task2 = asyncio.create_task(
                    say_after(2, 'world'))

    print(f"started at {time.strftime('%X')}")
    await task1
    print('Is it sequencial ?')
    await task2
    print(f"ended at {time.strftime('%X')}")


if __name__ == '__main__':
    asyncio.run(mainex())

输出为

$ python3 mainex.py                                                                                                     
started at 06:43:10
world
hello
Is it sequencial ?
ended at 06:43:14

1 个答案:

答案 0 :(得分:0)

create_task()的意思是“在后台运行此协程”(正在等待其他操作)。 await x的意思是“在x结束之前暂停执行此协程”。

因此,当您await task1时,等待等待4秒钟,因为那是task1花费的时间。在这4秒中的2秒之后,task2将完成,这就是await task2立即完成并且都等待4秒而不是6秒的原因。这清楚地表明任务是同时执行的,而不是顺序执行的,如果那是您的问题。

如果您的打印品迟到,可能是您的IDE和标准输出缓冲存在问题?尝试在终端中运行脚本,看看是否能达到预期的效果。