为何Python会执行未被await的task1?异步代码问题咨询
问题原因与解决方法
核心问题
你调用asyncio.create_task()创建task1和task2时,两个任务会立即被加入事件循环并开始执行,不是只有被await的任务才会启动。
当task1被创建后,事件循环就会开始为它计时1秒,到点就打印hello;而你await task2只是等待它完成(需要2秒),这期间task1早就执行完毕了,所以最终会先输出hello再输出world。
修正方案
如果只想输出world,只需要避免让task1被事件循环调度执行,有两种简单方式:
方式一:不创建task1的任务对象
直接去掉task1的asyncio.create_task()调用,只定义协程对象但不加入事件循环:
import asyncio async def say_after(delay, what): await asyncio.sleep(delay) print(what) async def main(): # 仅定义协程,不加入事件循环执行 task1 = say_after(1, 'hello') task2 = asyncio.create_task(say_after(2, 'world')) await task2 asyncio.run(main())
方式二:直接移除task1相关代码
如果不需要task1的逻辑,直接删掉它:
import asyncio async def say_after(delay, what): await asyncio.sleep(delay) print(what) async def main(): task2 = asyncio.create_task(say_after(2, 'world')) await task2 asyncio.run(main())
内容的提问来源于stack exchange,提问作者AKTanara
相关产品推荐
相关产品推荐

