为何Python中我的asyncio任务无法并发执行?
Asyncio任务顺序执行而非并发的问题解决
你的问题出在连续使用await调用协函数——每次await都会暂停当前协程,直到被调用的协函数执行完毕才会继续下一行代码。所以say_after(2, 'hello')会先跑满2秒,之后才会启动say_after(1, 'world'),总耗时自然是2+1=3秒。
要实现并发,你需要先把协函数包装成任务(Task)让asyncio调度器同时管理,再等待所有任务完成。这里有两种常用方法:
方法1:使用asyncio.create_task
先创建任务对象,让调度器立即开始执行,之后再等待任务结束:
import asyncio import time async def say_after(delay, message): await asyncio.sleep(delay) print(message) async def main(): print(f"started at {time.strftime('%X')}") # 创建任务并立即调度 task1 = asyncio.create_task(say_after(2, 'hello')) task2 = asyncio.create_task(say_after(1, 'world')) # 等待两个任务完成 await task1 await task2 print(f"finished at {time.strftime('%X')}") asyncio.run(main())
方法2:使用asyncio.gather
一次性收集多个协函数,让它们并发执行,再等待所有完成:
import asyncio import time async def say_after(delay, message): await asyncio.sleep(delay) print(message) async def main(): print(f"started at {time.strftime('%X')}") # 并发运行多个协程 await asyncio.gather( say_after(2, 'hello'), say_after(1, 'world') ) print(f"finished at {time.strftime('%X')}") asyncio.run(main())
这两种写法的效果一致:两个任务会同时启动,world会在1秒后先打印,hello在2秒后打印,总耗时约2秒,符合你的预期。
内容的提问来源于stack exchange,提问作者Rajashree P
相关产品推荐
相关产品推荐

