为什么Node.js cluster.fork()没有在Windows 8上创建我的进程副本?

时间:2014-02-27 07:14:59

标签: javascript windows node.js

我正在尝试使用Node.js以及在我的公司建议是否可行。作为一个初学者,我试图在没有Express(或替代)的情况下处理Node,以及未处理的异常导致整个过程关闭并且基本上让我离开网络的事实似乎是一个问题。它非常清楚地说明了not to use an uncaught exception handler吞噬错误的过程。

Node.js的cluster module似乎可以很好地处理它,如果我将它与domains结合使用。事实上,domains recommend using them to just send out a 500并使用集群,以便您可以实际关闭错误的进程。

我正在运行Windows 8 Enterprise x64,并且使用msi为我的操作系统/架构设置了installed Node.js。我有Node.js工作,并一直在玩它。但是,当我从cluster module tutorial运行示例代码然后尝试点击http://localhost:8000时,我的浏览器无法连接。如果我在else块中调用console.log(),它也永远不会命中。

以下是我正在使用的代码:

var cluster = require('cluster');
var http = require('http');
var numCPUs = require('os').cpus().length;

if (cluster.isMaster) {
    // Tried this using what the defaults are from http://nodejs.org/api/cluster.html#cluster_cluster_settings
    // The values of these are undefined otherwise. Seems to make no difference.
    // Doesn't work if I remove this line either.
    cluster.settings = {
        execArgv: process.execArgv,
        exec: process.argv[1],
        args: process.argv.slice(2),
        silent: false
    };

    // 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("This never hits.");
    http.createServer(function(req, res) {
        res.writeHead(200);
        res.end("hello world\n");
    }).listen(8000);
}

这是我可以在Windows 8 Enterprise x64上修复的吗?有没有解释为什么它不起作用?

1 个答案:

答案 0 :(得分:1)

在Windows 8上使用Visual Studio调试nodejs应用程序时,我偶然发现了这个问题。

检查是否存在可能阻止侦听端口的过时nodejs进程。令人惊讶的是,当端口被另一个进程阻塞时,listen()没有异常。我的情况是我手动杀死陈旧的进程,集群按预期工作。