Ris*_*abh 5 multithreading core node.js libuv
据我所知,所有 IO 请求和其他异步任务都是由libuvin完成的nodejs。我想知道是否libuv正在使用线程。如果是,它是否使用了所有可用的核心?
libuv 模块的职责与标准库中的某些特定功能相关。对于某些标准库函数调用,节点 C++ 端和 libuv 决定完全在事件循环之外进行昂贵的计算。他们制作了一种称为线程池的东西,该线程池是一系列四个线程,可用于运行计算密集型任务例如哈希函数。
默认情况下,libuv 在此线程池中创建四个线程。Thread Pool图中的组织方式是Libuv这样的,这意味着除了用于事件循环的线程之外,还有四个其他线程可用于卸载需要在我们的应用程序内部进行的昂贵计算。节点标准库中包含的许多函数都会自动使用该线程池。
Network(网络IO)负责api请求,File system(文件IO)是fs 模块。所以node.js单线程将这些繁重的工作委托给libuv
如果你有太多的函数调用,它将使用所有的核心。CPU 核心实际上并不会加快处理函数调用的速度,它们只是允许您正在执行的工作内部实现一定量的并发性。
首先,什么是libuv。正如文档中提到的,它是一个多平台支持库,专注于异步 I/O。
libuv不将线程用于异步任务,而是用于那些本质上不是异步的任务。
例如,它不使用线程来处理套接字,而是使用线程使同步 fs 调用异步。
当涉及线程时,libuv 使用一个线程池,您可以在编译时使用UV_THREADPOOL_SIZE.
node.js提供了一个预编译版本,libuv因此是一个固定UV_THREADPOOL_SIZE参数。
不用说,它与您芯片的内核数无关。
我很想肯定您可以安全地忽略该主题,因为libuv因此node.js不要为了它们的目的而集中使用线程(除非您以非常不正常的方式使用它们,或者您正在运行大量libuv工作请求)。如果您像大多数用户一样需要,可以
随意运行node.js每个核心的实例。
该设计概述部分的libuv也是关于这一点再清楚不过:
I/O(或事件)循环是 libuv 的核心部分。它为所有 I/O 操作建立内容,并且它意味着绑定到单个线程。只要每个事件循环在不同的线程中运行,就可以运行多个事件循环。
| 归档时间: |
|
| 查看次数: |
1703 次 |
| 最近记录: |