【问题标题】:Is the libuv thread pool used for async file I/O in Node.js? Why?libuv 线程池是否用于 Node.js 中的异步文件 I/O?为什么?
【发布时间】:2021-06-23 00:48:21
【问题描述】:

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

鉴于网络 I/O 和异步文件 I/O 本质上都是依赖于操作系统且非阻塞的,为什么前者由事件循环处理,而后者由线程池处理?

【问题讨论】:

    标签: node.js libuv


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-21
      • 1970-01-01
      • 2020-07-16
      • 1970-01-01
      • 2015-01-17
      相关资源
      最近更新 更多