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

Node.js 在NodeJS中,什么是libuv,它是否使用所有核心?,node.js,multithreading,core,libuv,Node.js,Multithreading,Core,Libuv,据我所知,所有IO请求和其他异步任务都是由nodejs中的libuv完成的。 我想知道libuv是否正在使用线程。如果是,它是否使用所有可用的内核?来自: Node.js的单个实例在单个线程中运行。接受 用户有时希望启动的多核系统的优势 Node.js进程集群用于处理负载 集群模块允许轻松创建所有子进程 共享服务器端口 在某些情况下,多进程可能比多线程更好。有些人甚至认为Thead是邪恶的。也许node.js的设计是为了更好地利用进程而不是线程。首先,什么是libuv。如中所述,它是一个多平台支

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

来自:

Node.js的单个实例在单个线程中运行。接受 用户有时希望启动的多核系统的优势 Node.js进程集群用于处理负载

集群模块允许轻松创建所有子进程 共享服务器端口


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

首先,什么是
libuv
。如中所述,它是一个多平台支持库,重点关注异步I/O

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

当涉及线程时,
libuv
可以在编译时使用
UV\u THREADPOOL\u size
更改的大小
node.js
提供了一个预编译版本的
libuv
,因此提供了一个固定的
UV\u THREADPOOL\u SIZE
参数。
不言而喻,这与芯片的内核数量无关

我想肯定的是,您可以安全地忽略这个主题,因为
libuv
,因此
node.js
不会为了它们的目的大量使用线程(除非您以非常不正当的方式使用线程,或者运行大量
libuv
工作请求)。
如果您需要,可以像大多数用户一样为每个核心运行
node.js

关于这一点,
libuv
的定义也非常清楚:

I/O(或事件)循环是libuv的核心部分。它为所有I/O操作建立了内容,并将其绑定到单个线程。只要每个事件循环在不同的线程中运行,就可以运行多个事件循环


libuv模块的职责与标准库中的某些特定函数相关。对于一些标准库函数调用,节点C++侧和LIBUV决定完全在事件循环之外进行昂贵的计算。它们会产生一个称为线程池的东西,即线程池是一系列四个线程,它们可以用于运行计算密集型任务,例如散列函数。 默认情况下,libuv在此线程池中创建四个线程。这意味着,除了用于事件循环的线程外,还有四个其他线程可用于卸载需要在应用程序内部进行的昂贵计算。节点标准库中包含的许多函数将自动使用此线程池


如果有太多的函数调用,它将使用所有内核。CPU内核实际上并没有加快处理函数调用的速度,它们只允许您正在执行的工作中存在一定程度的并发性。

是的,libuv有一个线程池。如果系统是多核的,它是否使用所有内核?