Python中aiofiles异步文件操作为何比普通同步文件操作耗时更长?
异步代码耗时更长的核心原因
你的代码逻辑本身没有错误,出现这个结果完全是测试场景和异步IO的特性不匹配导致的,具体原因如下:
- 测试场景不符合异步IO的适用条件
你测试的是本地小文件读取,本地磁盘IO的延迟本身就在微秒级,10个小文件串行同步读取的总耗时只有1ms,而异步框架本身有固定的调度开销:asyncio事件循环的启动、任务上下文切换、aiofiles的封装开销加起来就已经超过了读取文件本身的耗时,自然总耗时更高。
异步IO的核心优势是覆盖高延迟IO场景,比如读取远程存储的文件、调用外部接口等,这类场景单个IO等待时间就有几十到几百毫秒,异步可以在等待某个IO返回的间隙调度其他任务执行,省下的总等待时间会远远覆盖自身的调度开销。 aiofiles的实现本身有额外成本
Python的异步标准库目前没有原生支持内核级异步文件IO,aiofiles底层是把同步的文件读写操作扔到线程池中执行,再把结果回传给事件循环,跨线程调度、数据传递的开销在小文件读写场景下会被放大,比直接调用原生同步open的开销高很多。- 测试用例规模太小
10个小文件的测试规模不足以体现异步的优势,如果把测试文件数量提升到上千个,或者换成大体积文件,再或者把读取目标换成远程文件,异步的耗时会明显低于同步实现。
内容的提问来源于stack exchange,提问作者SinaMobasheri
相关产品推荐
相关产品推荐

