在节点js中,什么是libuv,并使用所有核心?
据我所知,所有IO请求和其他asynchronous任务都是由libuv
中的nodejs
完成的。 我想知道:使用线程是libuv
吗? 如果是,是否使用所有可用的核心?
从这里 :
Node.js的单个实例在单个线程中运行。 为了利用多核系统,用户有时需要启动一个Node.js进程集群来处理负载。
群集模块允许轻松创build所有共享服务器端口的subprocess。
在某些情况下,多进程可能比multithreading更好。 有些人甚至认为这些人是邪恶的。 也许node.js被devise成比线程更好地利用进程。
首先,什么是livuv
。 正如文档中所提到的那样,这是一个多平台支持库,主要关注asynchronousI / O。
libuv
不使用线程来执行asynchronous任务,但对于那些本质上不是asynchronous的。
作为一个例子,它不使用线程来处理套接字,它使用线程来使asynchronous的fs调用asynchronous。
当涉及到线程时, libuv
使用一个线程池,其大小可以在编译时使用UV_THREADPOOL_SIZE
来UV_THREADPOOL_SIZE
。
node.js
提供了libuv
的预编译版本,因此提供了一个固定的UV_THREADPOOL_SIZE
参数。
不用说,这与芯片的内核数量无关。
我试图肯定,你可以放心地忽略这个话题,因为libuv
,因此node.js
不会为了他们的目的而密集地使用线程(除非你以一种非常不正确的方式使用它们,或者如果你运行的是大量的libuv
工作请求)。
如果大多数用户需要,可以随意运行每个核心的node.js
实例。
libuv
的devise概述部分在这一点上也很清楚:
I / O(或事件)循环是libuv的核心部分。 它为所有的I / O操作build立内容,并且意味着绑定到单个线程。 只要运行在不同的线程中,就可以运行多个事件循环。