【问题标题】:Node.js asynchronous call handling and multi-core scalingNode.js 异步调用处理和多核扩展
【发布时间】:2015-05-22 12:07:42
【问题描述】:

众所周知,node.js 内部处理异步调用,程序员永远不需要关心后台发生了什么。据我所知,即使每个人都说 node.js 只是单线程,但内部 v8/libuv 库正在产生线程来处理程序的异步片段的执行。

我的问题是,如果产生了这些线程,它们是否会扩展多核架构?我的意思是,如果我有一个具有 4 个内核的 CPU,并且我的主节点线程在其中一个 CPU 上运行,那么这些内部生成的线程是否会扩展到其他三个 CPU,而不是保持在同一个 CPU 上。理论上它们应该可以扩展,但由于每个人都说 node.js 开箱即用不使用多核,我认为这值得一问。

【问题讨论】:

    标签: node.js multithreading asynchronous multicore event-loop


    【解决方案1】:

    Node.js 处理每个进程一个线程。要使其扩展到多个核心,您需要运行多个 Node.js 服务器,每个核心一个,并在它们之间拆分请求流量。

    【讨论】:

    • one-thread-per-process :我认为这句话的理解不正确。有一个进程(节点进程),它是线程(主节点线程),但在处理异步调用的过程中会产生更多线程。如果一切都只用一个线程处理,为什么会有人需要像 v8 和 libuv 这样的线程库?
    • Node.js 仅适用于单线程执行,这实际上意味着它基于事件循环通过单线程执行所有操作。如果您希望 node.js 使用单处理器的多个内核,那么请使用集群。
    • 另外,v8 提供了强大的多线程环境,所以不要与多核混合使用
    • 感谢@Pragya 的回复,但我仍然对答案不满意。多线程环境自然意味着这些线程可能/可以在 CPU 上可用的不同内核上运行。如果 node.js 一直在一个线程上工作,那么异步调用如何在不阻塞执行的情况下是可能的。例如,如果主线程正在执行所有这些异步片段,那么系统如何能够监听新连接?
    猜你喜欢
    • 1970-01-01
    • 2016-04-29
    • 2011-08-14
    • 1970-01-01
    • 2011-03-18
    • 2012-12-27
    • 2018-01-02
    • 1970-01-01
    相关资源
    最近更新 更多