

新闻资讯
技术学院Python文件IO默认阻塞,因调用操作系统同步系统调用(如read(2)),即使数据在页缓存中也需等待内核返回,机械硬盘或网络文件系统延迟可达毫秒级。
Python 文件 IO 默认是阻塞的,这意味着调用 read()、write()、open() 等操作时,程序会停在当前线程等待系统完成磁盘或缓冲区操作,期间无法执行其他任务。这是性能瓶颈的常见根源,尤其在高并发、大文件处理或实时响应场景中。
底层上,Python 的内置文件对象基于操作系统提供的同步(blocking)系统调用(如 Linux 的 read(2) 和 write(2))。即使数据已在页缓存中,Python 仍需等待内核返回结果;若涉及机械硬盘寻道、网络文件系统(NFS)、远程挂载(如 SMB/CIFS),延迟可能达毫秒甚至百毫秒级。
open() 返回的是同步文件对象,所有 I/O 方法都阻塞当前线
程os.read()/os.write() 同样阻塞,且不带缓冲,更易暴露底层延迟buffering=0 关闭缓冲,也不会解除阻塞,只影响数据暂存行为以下情况容易因阻塞式 IO 拖慢整体性能:
read() 完成json.load(f) 或 pickle.load(f) 处理大序列化文件,反序列化前已阻塞在读取阶段不依赖第三方库的前提下,可从三方面入手:
asyncio + aiofiles 替代内置 open,将 IO 调度交给事件循环,释放主线程。注意:aiofiles 本身不真正异步,而是在线程池中执行阻塞调用并 await 结果concurrent.futures.ThreadPoolExecutor 并发读写;对 CPU 密集型 IO 后处理,优先选 ProcessPoolExecutor
mmap.mmap(),按需访问磁盘区域,减少拷贝和阻塞时间用标准库工具定位瓶颈:
python -m cProfile -s cumulative your_script.py,重点观察 read、write、open 在总耗时中的占比strace -e trace=read,write,openat python your_script.py 2>&1 | head -20(Linux)看系统调用耗时time.time(),确认单次调用是否异常延迟(如 >10ms)