【问题标题】:How to fully utilise server capacity for Node.js Web Apps如何充分利用 Node.js Web 应用程序的服务器容量
【发布时间】:2015-12-19 01:57:11
【问题描述】:

Node.js 最新版本(4.2.3)现在支持多线程吗?很难找到有用的答案,因为大多数相关讨论都是几年前的。

node.js 云服务器如何处理 node.js Web App 请求?假设一个 2-Core 服务器运行一个 node.js 应用程序,这是否意味着无论流量有多大,它们都通过一个内核,而另一个内核总是空闲?

如果答案是肯定的,是否有一些第三方库的建议可能会为 node.js Web 应用程序实现多线程?


感谢您的帮助。除了上面的问题。我将集群代码采用到 Express.js Web 应用程序中,结果发现在下面的代码部分中没有执行 else 块。 var app = require('../app'); var debug = require('debug')('NewExpress:server'); var http = require('http'); var cluster = require('cluster'); 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 {

    /**
     * Get port from environment and store in Express.
     */

    var port = normalizePort(process.env.PORT || '3000');
    app.set('port', port);

    /**
     * Create HTTP server.
     */

    var server = http.createServer(app);

    /**
     * Listen on provided port, on all network interfaces.
     */

    server.listen(port);
    server.on('error', onError);
    server.on('listening', onListening);
}

任何想法我应该如何在这里实现集群?

【问题讨论】:

  • Clusters。关于多线程,Node.js 不太适合简单的“是或否”。它一直使用多个线程。然而,它只使用其中之一与 v8 引擎来执行 JavaScript 代码。本机扩展可以利用其他线程来执行大量异步 I/O。

标签: node.js multithreading


【解决方案1】:

您可以像这样使用您的每个 CPU:

var cluster = require('cluster');
var numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
  for (var i = 0; i < numCPUs; i++) {
    cluster.fork();
  }
} else {
  startServer();
}

更新

举个更完整的例子,你可以在 index.js 中抛出这个:

var express = require('express');
var app = express();
var cluster = require('cluster');
var numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
  for (var i = 0; i < numCPUs; i++) {
    cluster.fork();
  }
} else {
  startServer();
}

function startServer() {
  var server = app.listen(3000, function () {
      var port = server.address().port;
      console.log('Example app listening at %s', port);
    });
}

在终端中运行 node index.js 以启动它。 它会用我的 8 cpu 怪物记录这个:

Example app listening at 3000
Example app listening at 3000
Example app listening at 3000
Example app listening at 3000
Example app listening at 3000
Example app listening at 3000
Example app listening at 3000
Example app listening at 3000

更新 2

在看到问题编辑后,我调整了您的示例。这应该工作

var http = require('http');
var express = require('express');
var app = express();
var cluster = require('cluster');
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 {
    console.log('in else statement');
    var port = '3000';
    app.set('port', port);
    var server = http.createServer(app);
    server.listen(port);
}

它应该在控制台中显示这个

in else statement
in else statement
in else statement
in else statement
in else statement
in else statement
in else statement
in else statement

如果这不适合你,请告诉我。

【讨论】:

  • 与上述代码相关的另一个问题。我正在使用 Express.js 构建一个 Web 应用程序。但是,当我尝试采用上述代码时,else 块似乎没有执行。你能帮我检查一下吗?提前致谢。
  • 谢谢柯特。我已经以多种方式进行了测试,并意识到当我在 WebStorm 中点击“运行”而不是“调试”模式时它可以完美运行。所以我想我需要在开发环境中注释掉集群相关代码。
  • 如果您将其注释掉,或者您必须记住在部署之前取消注释它。我对 webstorm 不熟悉,但也许可以尝试在本地机器上为你的节点进程设置一个环境变量。如果您使用的是 mac,请在您的 .bash_profile 中添加类似“export NODE_ENV=dev”的内容。这样,您可以使用“ If process.env.NODE_ENV != 'dev' ... 使集群在不在您的开发环境中运行。如果您在 Windows 上,请尝试“SET NODE_ENV=dev”。我不是确定如何在 Windows 上持久保存它。
猜你喜欢
  • 2017-10-03
  • 2013-05-02
  • 2013-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-23
相关资源
最近更新 更多