在node js中,什么是libuv,它是否使用所有核心?

In node js, what is libuv and does it use all core?

据我所知,所有的IO请求和其他异步任务都是在nodejs中由libuv完成的。 我想知道 libuv 是否正在使用线程。如果是,它是否使用了所有可用的内核?

来自here

A single instance of Node.js runs in a single thread. To take advantage of multi-core systems the user will sometimes want to launch a cluster of Node.js processes to handle the load.

The cluster module allows easy creation of child processes that all share server ports.

在某些情况下,多进程可能比多线程更好。有些人甚至认为theads是邪恶的。也许 node.js 的设计方式是为了比线程更好地利用进程。

首先,什么是libuv。如 documentation 中所述,它是一个 多平台支持库,专注于异步 I/O.

libuv 不将线程用于异步任务,但用于那些本质上不是异步的任务。
例如,它不使用线程来处理套接字,它使用线程使同步 fs 调用异步。

当涉及线程时,libuv uses a thread pool 您可以在编译时使用 UV_THREADPOOL_SIZE 更改其大小。
node.js 提供了 libuv 的预编译版本,因此有一个固定的 UV_THREADPOOL_SIZE 参数。
不言而喻,这与你的芯片的核心数无关。

我很想确认您可以安全地忽略该主题,因为 libuv 因此 node.js 不要为了它们的目的而大量使用线程(除非您真正地使用它们不正当的方式,或者如果您 运行 宁大量 libuv 工作请求)。
如果您像大多数用户一样需要,请随意 运行 每个内核 node.js 个实例。

libuvdesign overview section这一点也说的很清楚了:

The I/O (or event) loop is the central part of libuv. It establishes the content for all I/O operations, and it’s meant to be tied to a single thread. One can run multiple event loops as long as each runs in a different thread.

libuv 模块的职责与标准库中的某些特定函数相关。对于一些标准库函数调用,节点 C++ 端和 libuv 决定在事件循环之外进行昂贵的计算 entirely.They 创建一个线程池,该线程池是一系列的四个线程,可用于 运行 计算密集型任务,例如哈希函数。

默认情况下,libuv 在这个线程池中创建了四个线程。因此,这意味着除了用于事件循环的那个线程之外,还有四个其他线程可用于卸载需要在我们的应用程序内部发生的昂贵计算。节点标准库中包含的许多函数将自动使用此线程池。

如果你有太多的函数调用,它会使用所有的内核。 CPU 内核实际上并不会加快处理函数调用的速度,它们只是允许在您正在执行的工作中进行一定数量的并发。