首页 > 解决方案 > Node Js 是否使用 libuv 线程池进行网络 I/O

问题描述

我在学习Node.js

我在 libuv 官方文档中找到了这个注释-

libuv使用 athread pool使asynchronous file I/O操作成为可能,但network I/O始终在单个线程中执行,即每个循环的线程。”</p>

我的问题是针对以下声明(来自非官方资源)-

“今天的操作系统已经为许多 I/O 任务(例如 Linux 上的 AIO)提供了异步接口。只要有可能,libuv 将使用这些异步接口,避免使用线程池。”

- 该声明是适用于异步file I/O operations还是仅适用于Network I/O

  1. 意味着如果有文件 I/O 操作,那么在这种情况下将强制使用线程池或 libuv 将使用那些异步接口,避免使用线程池?
  2. Libuv 是否为网络 I/O 使用线程池?

标签: node.jslibuv

解决方案


对于一些标准库函数调用,节点 C++ 端和 libuv 决定完全在事件循环之外进行昂贵的计算。他们制作了称为线程池的东西,线程池是一系列四个线程,可用于运行计算密集型任务例如散列函数或读取硬盘中的文件(fs 模块函数)。只有四样东西使用线程池——DNS 查找、fs、crypto 和 zlib。

因此,正如 node 标准库有一些使用 libuv 线程池的函数一样,它也有一些使用通过 libuv 内置到底层操作系统中的代码的函数。libuv 和 node 都没有任何代码来处理所有这些低级网络请求操作。相反,libuv 将请求委托给底层操作系统。所以实际上是我们的操作系统来处理真正的网络请求。Libuv 用于发出请求,然后它只是等待操作系统发出信号,表明某些响应已返回到请求。网络 I/O 由系统中的网络硬件完成,ISP.OS 只是跟踪连接,一旦 I/O 操作完成,操作系统会将结果传递给 Libuv。


推荐阅读