【发布时间】:2021-06-23 00:48:21
【问题描述】:
据我了解,libuv 线程池仅用于几件事,其中之一是本质上阻塞的 IO。这包括文件系统操作(大部分 fs 模块),当然也包括它们的异步操作。
鉴于网络 I/O 和异步文件 I/O 本质上都是依赖于操作系统且非阻塞的,为什么前者由事件循环处理,而后者由线程池处理?
【问题讨论】:
据我了解,libuv 线程池仅用于几件事,其中之一是本质上阻塞的 IO。这包括文件系统操作(大部分 fs 模块),当然也包括它们的异步操作。
鉴于网络 I/O 和异步文件 I/O 本质上都是依赖于操作系统且非阻塞的,为什么前者由事件循环处理,而后者由线程池处理?
【问题讨论】:
据我了解,这与 libuv 实现有关,它没有选择在它支持的所有不同操作系统上使用 OS-native 异步文件 I/O。因此,它使用线程池为线程内部使用的阻塞文件 I/O 提供异步接口。
This article 讨论了在 Windows 上避免操作系统级异步文件 I/O 的一些可能原因,这可能是 libuv 没有选择这样做的部分原因。
而且,this note from Microsoft 讨论了一些情况,即使使用 Microsoft 异步 API,调用最终也是同步的。换句话说,如果你想保证它始终是异步的,你必须像 libuv 一样将它隐藏在 OS 线程中。
对于网络接口,libuv 选择依赖的各种操作系统平台之间的异步支持具有更好的一致性。
【讨论】: