【问题标题】:Why do we need node clusters if we can change the number of threads utilized by the threadpool?如果我们可以更改线程池使用的线程数,为什么还需要节点集群?
【发布时间】:2021-03-13 08:08:22
【问题描述】:

标题基本上说明了一切,既然我们可以更改 libuv 线程池使用的线程数,为什么还要创建节点工作器?

【问题讨论】:

    标签: javascript node.js multithreading multiprocessing libuv


    【解决方案1】:

    libuv 线程池不用于您的 JavaScript 代码,仅用于 Node.js 的 API 子集(尽管它被最主要的 API 之一使用,fs)。来自the documentation

    Node.js 尽可能使用异步系统 API,但在它们不存在的地方,libuv 的线程池用于基于同步系统 API 创建异步节点 API。使用线程池的 Node.js API 有:

    • 所有fs API,文件观察程序 API 和显式同步的 API 除外
    • 异步加密API,例如crypto.pbkdf2()crypto.scrypt()crypto.randomBytes()crypto.randomFill()crypto.generateKeyPair()
    • dns.lookup()
    • 所有zlib API,显式同步的 API 除外

    所以libuv 线程池的大小有助于处理大量重叠的fs 和类似调用,但这并不是全部。

    如果您的 JavaScript 代码需要同步执行大量工作,libuv 池对您没有帮助;该代码在单个线程上运行(除非您启动工人)。此外,Node.js 使用同一线程来检查异步工作的完成情况(包括 libuv 完成情况)。来自event loop page

    下图显示了事件循环操作顺序的简化概览。

       ┌───────────────────────────┐
    ┌─>│           timers          │
    │  └─────────────┬─────────────┘
    │  ┌─────────────┴─────────────┐
    │  │     pending callbacks     │
    │  └─────────────┬─────────────┘
    │  ┌─────────────┴─────────────┐
    │  │       idle, prepare       │
    │  └─────────────┬─────────────┘      ┌───────────────┐
    │  ┌─────────────┴─────────────┐      │   incoming:   │
    │  │           poll            │<─────┤  connections, │
    │  └─────────────┬─────────────┘      │   data, etc.  │
    │  ┌─────────────┴─────────────┐      └───────────────┘
    │  │           check           │
    │  └─────────────┬─────────────┘
    │  ┌─────────────┴─────────────┐
    └──┤      close callbacks      │
       └───────────────────────────┘
    

    这样一个线程即使在不运行 JavaScript 代码时也能做很多工作。

    如果您启动工作线程,它们每个都有自己的事件循环,并且可以处理与其工作相关的完成,即使另一个线程正忙于做一些 CPU 密集型的事情。

    因此,工作线程在任何给定情况下是否有用很大程度上取决于您的代码在做什么。

    【讨论】:

    • 谢谢!我想我误解了节点如何处理异步操作,我认为所有这些操作都被事件循环卸载到 libuv 的线程池,但如果不是这种情况,这些操作(比如从 db 获取信息)在哪里执行?
    • @ThabetSabha - 他们使用操作系统中的异步 API 从主线程启动,让该线程在工作发生时继续做其他事情。这些异步 OS API 提供了一种检查完成情况的方法,线程在调用 JavaScript 代码之间进行检查。我不是 Node.js 事件循环方面的专家,我敢肯定它比这更微妙,但这是他们在链接事件循环页面中传达的一般想法。
    • 太棒了,我有一段时间对此感到困惑,但这确实有助于解决问题,再次感谢您!
    猜你喜欢
    • 2017-12-11
    • 2020-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-29
    • 2021-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多