Node.js中的异步文件I/O是否使用了libuv线程池?为什么?
Is the libuv thread pool used for async file I/O in Node.js? Why?
据我了解,libuv 线程池仅用于少数几件事,其中之一是本质上阻塞的 IO。这包括文件系统操作(大多数 fs
模块),当然也包括它们的异步操作。
鉴于网络I/O和异步文件I/O都是OS依赖且本质上是非阻塞的,为什么前者由事件循环处理而后者处理通过线程池?
据我了解,这与 libuv 实现有关,它没有选择在它支持的所有不同操作系统上使用 OS- 本地异步文件 I/O。因此,它使用线程池为线程内部使用的阻塞文件 I/O 提供异步接口。
This article 讨论了在 Windows 上避免 OS 级异步文件 I/O 的一些可能原因,这可能是 libuv 没有的部分原因选择走那条路。
并且,this note from Microsoft 讨论了一些情况,即使在使用 Microsoft 异步 API 时,调用最终也是同步的。换句话说,如果你想保证它始终是异步的,你必须像 libuv 那样将它隐藏在一个 OS 线程中。
至于网络接口,libuv 选择依赖的各种 OS 平台之间的异步支持具有更好的一致性。
据我了解,libuv 线程池仅用于少数几件事,其中之一是本质上阻塞的 IO。这包括文件系统操作(大多数 fs
模块),当然也包括它们的异步操作。
鉴于网络I/O和异步文件I/O都是OS依赖且本质上是非阻塞的,为什么前者由事件循环处理而后者处理通过线程池?
据我了解,这与 libuv 实现有关,它没有选择在它支持的所有不同操作系统上使用 OS- 本地异步文件 I/O。因此,它使用线程池为线程内部使用的阻塞文件 I/O 提供异步接口。
This article 讨论了在 Windows 上避免 OS 级异步文件 I/O 的一些可能原因,这可能是 libuv 没有的部分原因选择走那条路。
并且,this note from Microsoft 讨论了一些情况,即使在使用 Microsoft 异步 API 时,调用最终也是同步的。换句话说,如果你想保证它始终是异步的,你必须像 libuv 那样将它隐藏在一个 OS 线程中。
至于网络接口,libuv 选择依赖的各种 OS 平台之间的异步支持具有更好的一致性。