`asyncio.run()`不等待协同程序完成

2024-04-24 07:22:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我在Python3.7.3中运行这段代码

import asyncio

async def fun(time):
    print(f"will wait for {time}")
    await asyncio.sleep(time)
    print(f"done waiting for {time}")

async def async_cenas():
    t1 = asyncio.create_task(fun(1))
    print("after 1")
    t2 = asyncio.create_task(fun(2))
    print("after 2")

def main():
    t1 = asyncio.run(async_cenas())
    print("ok main")
    print(t1)

if __name__ == '__main__':
    main()
    print("finished __name__")

并获得此输出:

after 1
after 2
will wait for 1
will wait for 2
ok main
None
finished __name__

我还希望看到:

done waiting for 1
done waiting for 2

也就是说,为什么期望asyncio.run(X)在继续之前会等待协同路由完成


Tags: nameasyncioforasynctimemaindefwill
1条回答
网友
1楼 · 发布于 2024-04-24 07:22:50

如果您想等待create_task生成的所有任务完成,那么您需要显式地执行,例如,只需依次为它们执行await,或者使用异步IO工具,如^{}^{}(区别在here中描述)。否则,当退出传递给asyncio.run的主协程时,asyncio.run将取消它们

例如:

import asyncio

async def fun(time):
    print(f"will wait for {time}")
    await asyncio.sleep(time)
    print(f"done waiting for {time}")

async def async_cenas():
    t1 = asyncio.create_task(fun(1))
    print("after 1")
    t2 = asyncio.create_task(fun(2))
    print("after 2")
    await asyncio.wait({t1, t2}, return_when=asyncio.ALL_COMPLETED)
    # or just
    # await t1
    # await t2

def main():
    t1 = asyncio.run(async_cenas())
    print("ok main")
    print(t1)

if __name__ == '__main__':
    main()
    print("finished __name__")
after 1
after 2
will wait for 1
will wait for 2
done waiting for 1
done waiting for 2
ok main
None
finished __name__

相关问题 更多 >