按I/O等待时长排序asyncio.gather未获预期性能提升的排查
关于asyncio.gather协程排序对性能影响的复现疑问
曾看到一篇文章提到,按预期I/O等待时长降序排列协程传入asyncio.gather(*coroutines)可以提升执行速度,文章建议:
Try to pass coroutines in asyncio.gather() ordered by the expected IO wait time descending. That is, the first argument should be the coroutine with the highest expected IO wait, and so on.
我尝试复现这一结论,创建的协程包含以下步骤:
- CPU密集任务
- I/O密集任务(网络调用)
- 再次执行CPU密集任务
实验细节:
- 使用httpx客户端调用本地Flask服务的不同延迟API,替代文章中的SQL查询作为I/O任务
- CPU密集任务为写入随机数到文件的自定义函数
我的环境是Python 3.10.6,运行在Macbook M1上,但无论协程按I/O等待时长升序还是降序传入asyncio.gather,都未发现一致且显著的性能差异。先后进行了三次实验:
- 初始实验:Flask提供1s、3s、5s延迟的API,测试两种排序的执行时间,结果降序排列耗时12.32s,反而比升序的12.11s更长,与文章结论相悖。
- 改进实验:在Flask中用PostgreSQL的
pg_sleep模拟I/O延迟,协程包含前后CPU任务+中间数据库sleep,两种排序的执行时间几乎无差异(9.42s vs 9.44s)。 - 调整实验:将CPU任务替换为
time.sleep(1),调用不同端口的Flask延迟API,降序耗时9.07s仅略优于升序的9.14s,差异不显著。
我不确定是复现方式有误,还是Python/Asyncio新版本已解决该问题,作为性能分析新手,希望得到帮助和建议。
内容的提问来源于stack exchange,提问作者jcleow
相关产品推荐
相关产品推荐

