Python3 Asyncio代码无法并发执行,如何实现两个异步函数并行运行?
问题根因
Asyncio的协程是协作式调度,只有当前运行的协程主动让出执行权时,事件循环才会切换到其他待执行的协程。你写的test1、test2两个异步函数内部只有连续的打印逻辑,全程没有任何IO等待或者主动让出CPU的操作,所以第一个任务被调度后会一口气跑完整个循环才会释放执行权,第二个任务只能等第一个完全结束后才会运行,自然没有并行的特征。
修复方案
你只需要在循环内部加一行await asyncio.sleep(0),主动触发调度切换即可,修改后的代码如下:
import asyncio import time async def test1(): for i in range(10): print(f"First function {i}") await asyncio.sleep(0) # 主动让出CPU,触发事件循环调度其他任务 async def test2(): for i in range(10): print(f"Second function {i}") await asyncio.sleep(0) async def main(): print(f"started at {time.strftime('%X')}") F = asyncio.create_task(test1()) S = asyncio.create_task(test2()) tasks = (F, S) await asyncio.gather(*tasks) print(f"finished at {time.strftime('%X')}") asyncio.run(main())
修改后运行就会看到两个函数的打印内容交替输出,符合你预期的并行执行效果。如果是真实业务场景,把asyncio.sleep(0)换成对应的异步IO操作(比如异步网络请求、异步文件读写)也会自动触发调度切换,不需要手动加sleep语句。
内容的提问来源于stack exchange,提问作者Garry Shnitzel
相关产品推荐
相关产品推荐

