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

时间:2017-10-15 09:32:22

标签: node.js multithreading core libuv

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

3 个答案:

答案 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内核实际上并不能加快处理功能的调用,它们只是在您正在执行的工作中允许一定程度的并发。