据我所知,所有IO请求和其他异步任务都由libuv
中的nodejs
完成。
我想知道:libuv
使用线程吗?如果是的话,是否使用了所有可用的核心?
答案 0 :(得分:1)
首先,livuv
是什么。正如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
个实例。
libuv
的{{3}}在这一点上也很清楚:
I / O(或事件)循环是libuv的核心部分。它为所有I / O操作建立内容,并且它意味着绑定到单个线程。只要每个事件循环在不同的线程中运行,就可以运行多个事件循环。
答案 1 :(得分:0)
来自here:
Node.js的单个实例在单个线程中运行。采取 用户有时希望推出的多核系统的优势 一组Node.js进程来处理负载。
群集模块可以轻松创建所有子进程 共享服务器端口。
在某些情况下,多个进程可能比多线程更好。有些人甚至认为这是邪恶的。也许node.js的设计方式可以比线程更好地利用进程。
答案 2 :(得分:0)
libuv模块的职责与标准库中的某些特定功能有关。对于某些标准库函数调用,节点C ++端和libuv决定完全在事件循环之外进行昂贵的计算,它们创建了一个称为线程池的东西,该线程池是一系列四个线程,可用于运行计算密集型任务例如哈希函数。
默认情况下,libuv在此线程池中创建四个线程。因此,这意味着除了用于事件循环的线程外,还有四个其他线程可用于卸载需要在应用程序内部进行的昂贵计算。节点标准库中包含的许多功能将自动使用此线程池。
如果函数调用过多,它将使用所有内核。 CPU内核实际上并不能加快处理功能的调用,它们只是在您正在执行的工作中允许一定程度的并发。