NodeJS - libuv 线程池是全局的还是每个进程的?

NodeJS - Is libuv threadpool global or per-process?

假设我有一台机器 运行 5 个不同的 nodejs 进程。每个节点进程有自己的libuv线程池,还是共享一个全局线程池?

我很困惑,因为我假设 libuv 线程池是每个进程的,但在 libuv 文档 (http://docs.libuv.org/en/latest/threadpool.html) 中它说:

The threadpool is global and shared across all event loops

我不确定我是否真的理解 "all event loops" 的意思。

所以,回到我的例子。如果我有 5 个 nodejs 进程,并且假设 libuv 的默认线程池大小为 4,我最终会使用:

a) 9 个线程:5 个 nodejs 事件循环 + 4 个用于全局线程池的 libuv 线程

b) 25 个线程:5 个 nodejs 事件循环 + (5 * 4) 个 libuv 线程,用于有 5 个不同的线程池,每个线程池有 4 个线程。

c) none 以上?

谢谢!

当文档说 "all events loops" 时,它指的是同一进程 中的所有 libuv 事件循环 。被引用的 "global" 部分在单个进程的范围内。

libuv 无法与任意子进程协调以确保在所有使用 libuv 的进程中只使用这么多线程system-wide。这可能需要一个配置文件或其他东西,而 libuv 不使用它。

所以如果你有 5 个节点进程,那么假设每个进程都使用默认的 libuv 线程池大小,你将总共有 20 个 libuv 线程(5 个进程 * 4每个线程)。现在请记住,每个进程都有 4 个以上的线程,但并非所有这些都是 libuv 线程。例如,您有用于 javascript 执行的主线程,但也有 V8 用于各种任务(如优化代码、垃圾收集等)的线程。