我不明白为什么在此代码段中,在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
答案 0 :(得分:0)
create_task()
的意思是“在后台运行此协程”(正在等待其他操作)。 await x
的意思是“在x结束之前暂停执行此协程”。
因此,当您await task1
时,等待等待4秒钟,因为那是task1
花费的时间。在这4秒中的2秒之后,task2
将完成,这就是await task2
立即完成并且都等待4秒而不是6秒的原因。这清楚地表明任务是同时执行的,而不是顺序执行的,如果那是您的问题。
如果您的打印品迟到,可能是您的IDE和标准输出缓冲存在问题?尝试在终端中运行脚本,看看是否能达到预期的效果。