NodeJS - libuv线程池是全局还是按进程?

时间:2017-02-02 23:48:40

标签: node.js multithreading architecture libuv

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

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

  

线程池是全局的,并在所有事件循环中共享

我不确定我是否真的理解“所有事件循环”的意思。

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

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

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

c)以上都没有?

谢谢!

1 个答案:

答案 0 :(得分:3)

当文档说“所有事件循环”时,它指的是同一进程中的所有libuv事件循环 。被引用的“全局”部分在单个过程的范围内。

libuv无法与任意子进程协调,以确保在使用libuv的所有进程中只在系统范围内使用这么多线程。这可能需要配置文件或libuv不使用的东西。

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

相关问题