我对node.js中的cluster / child_process模块很新。任何人都可以告诉我们如何创建主节点或如何将节点作为主节点?
大多数教程都提到如何验证节点是Master还是Worker(代码下面),而不是如何创建master。
编辑:
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');
//cluster.fork(); ----------(2)
});
} else {
// Workers can share any TCP connection
// In this case its a HTTP server
//cluster.fork();-----------(1)
http.createServer(function(req, res) {
res.writeHead(200);
console.log("hello worldd");
res.end("hello worldd\n");
}).listen(8000);
}
编辑:如何创建连续运行的正确子进程。如果我在上面的代码中使用cluster.fork(如1)创建新进程,则会立即创建和销毁工作进程。如果我在上面的代码中创建像(2)这样的工作者,它将进入无限循环的过程死亡和创造。如果上述示例不明确,请提供任何代码或链接,以演示创建子进程和同时处理不同进程的多个请求的正确工作示例。 非常感谢。
答案 0 :(得分:1)
您实际上创建主人。当您致电cluster.fork
时,它会创建一个子流程。主人仍然存在。 child和master都在相同的代码库上运行,并根据cluster.isMaster
进行区分。
编辑:
如果要在端口8000
上创建服务/网络服务器。您应该按照(2)中的说明进行操作。除了,对于你的情况,它将进入一个无限循环,因为你在'退出'事件上这样做而没有真正检查它'退出'的原因。您可以通过选中worker.suicide
例如:
if(cluster.isMaster) {
for(var i = 0; i< numCpus; i++)
cluster.fork();
cluster.on('exit', function(worker) {
if(worker.suicide) //do nothing
else cluster.fork();
});
} else {
// create server && listen on 8000
// no need to involve cluster here.
http.createServer(function(req, res) {}).listen(8000);
}
已编辑:示例要点:https://gist.github.com/limianwang/55e8a0b6ca816e024358
阅读:
答案 1 :(得分:1)
cluster.fork()创建一个不退出的子进程。调用res.end()不会退出子节点,它会等待并侦听更多连接。
上面的情况(2)只会在孩子调用process.exit()或被杀死时发生,在这种情况下,master会想要替换丢失的工作进程,但这不是一个紧密的循环。