libuv 线程池是否用于 Node.js 中的异步文件 I/O?为什么?

问题描述

据我所知,libuv 线程池仅用于少数几件事,其中之一是本质上是阻塞的 IO。这包括文件系统操作(大部分 fs 模块),当然也包括它们的异步操作。

鉴于网络 I/O 和异步文件 I/O 都是 OS 相关且非阻塞的,为什么前者由事件循环处理而后者由线程池处理?

解决方法

据我所知,这与 libuv 实现有关,它没有选择在它支持的所有不同操作系统上使用 OS-native 异步文件 I/O。因此,它使用线程池为线程内部使用的阻塞文件 I/O 提供异步接口。

This article 讨论了在 Windows 上避免操作系统级异步文件 I/O 的一些可能原因,这可能是 libuv 没有选择这样做的部分原因。

而且,this note from Microsoft 讨论了一些情况,即使在使用 Microsoft 异步 API 时,调用最终也是同步的。换句话说,如果你想保证它总是异步的,你必须像 libuv 一样将它隐藏在一个 OS 线程中。

至于网络接口,libuv 选择依赖的各种操作系统平台之间的异步支持具有更好的一致性。