【问题标题】:Node.js is single threaded does this mean we cannot run multiple Node.js in different threads?Node.js 是单线程的,这是否意味着我们不能在不同的线程中运行多个 Node.js?
【发布时间】:2023-04-05 13:06:01
【问题描述】:

我在一篇文章中读到 Node.js 是单线程的。问题是如果我们在不同的端口运行多个 Node.js 文件会怎样?他们有自己的线程还是全部都在 Node.js 主线程下? 有人可以阐明我现在处于黑暗面的主题。

【问题讨论】:

    标签: multithreading node.js


    【解决方案1】:

    问题是如果我们在不同的端口上运行多个 Node.js 文件会怎样?他们有自己的线程还是全部都在 Node.js 主线程下?

    根据您的问题,在我看来,您实际上是在启动多个 Node.js 进程。在这些情况下,它们将像您系统上的任何其他多进程集一样工作,并且您的操作系统将尝试平衡所有内核和/或 CPU 之间的负载。

    我在一篇文章中读到 Node.js 是单线程的。

    这有点复杂。虽然 Node.js 使用的 V8 JavaScript 引擎确实在单线程中运行您的 JavaScript,但许多 Node.js 库调用本机代码,可以使用任意多的线程。 Node.js 的这些内部结构使用线程池和多线程处理磁盘和网络 IO 以及其他任务。

    Node.js 真正大放异彩的应用程序是那些通常受 IO 限制的应用程序。在这些情况下,您无需为它编写任何代码即可获得多线程的许多好处。例如,当您向磁盘发出多个请求时,Node.js 将使用多个线程来处理该数据的缓冲和管理,同时不会阻塞您的主 JavaScript 线程。

    在我的许多应用程序中,我发现我可以充分利用 8 核机器,而无需编写任何代码来启动子进程。 Node 的内部多线程为我完成了所有工作。您的里程会因申请而异。

    我对过去的一个问题写了不同的解释,您可能会觉得有帮助:https://stackoverflow.com/a/19324665/362536

    【讨论】:

      【解决方案2】:

      http://nodejs.org/api/cluster.html

      Node 的单个实例在单个线程中运行。为了利用多核系统,用户有时需要启动 Node 进程集群来处理负载。

      集群模块允许您轻松创建所有共享服务器端口的子进程。

      var cluster = require('cluster');
      var http = require('http');
      var numCPUs = require('os').cpus().length;
      
      if (cluster.isMaster) {
        // Fork workers.
        for (var i = 0; i < numCPUs; i++) {
          cluster.fork();
        }
      
        cluster.on('exit', function(worker, code, signal) {
          console.log('worker ' + worker.process.pid + ' died');
        });
      } else {
        // Workers can share any TCP connection
        // In this case its a HTTP server
        http.createServer(function(req, res) {
          res.writeHead(200);
          res.end("hello world\n");
        }).listen(8000);
      }
      

      这意味着你必须自己架构,所以如果你想在不同的线程中监听不同的端口,要么使用cluster要么使用child_process

      【讨论】:

      • @phpGeek 看到答案与使用多核处理器有关,通过分叉进程。所以,这里不涉及线程。基本上你不能在 Node.js 中创建线程。但在这个 TruongSinh 的答案中,解释了如何通过从 master 分叉 child_process 来利用多核。有了端口,他的答案就在child processes shares server port
      • @phpGeek 如果您进一步阅读文档。简短回答:不,您只能在同一端口上运行实例,但可以在不同的 进程 上运行(除了父进程之外什么都不共享,但您的子进程可以相互通信)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-17
      • 2014-12-07
      • 1970-01-01
      • 2012-08-14
      • 1970-01-01
      • 1970-01-01
      • 2019-05-10
      相关资源
      最近更新 更多