关于 cluster 的问题(用自带的 cluster)!
发布于 12 年前 作者 bao2dan 4772 次浏览 最后一次编辑是 8 年前

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

// 获取 CPU 的数量 var workers = {}; if (cluster.isMaster) { console.log(‘master…’); // 初始化 CPU 数量相同的工作进程 for (var i = 0; i < numCPUs; i++) { var worker = cluster.fork(); workers[worker.pid] = worker; }

// 主进程分支
cluster.on('death', function (worker) {
    // 当一个工作线程结束时,重新启动一个工作线程
    delete workers[worker.pid];
    worker = cluster.fork();
    workers[worker.pid] = worker;
});

} else { // 工作進进程分支,启动服务器 console.log(‘worker----’);

http.createServer(function(req, res){
    console.log('%s %s', req.method, req.url);
    var body = 'Hello World';
    res.writeHead(200, { 'Content-Length': body.length });
    res.end(body);
}).listen(9000);

}

// 当主进程终止时,关闭所有工作进程 process.on(‘SIGTERM’, function () { for (var pid in workers) { process.kill(pid); } process.exit(0); });

================================ 以上代码,按设计应该是输出:'Hello World’ 但并没有输出,只在启动的时候输出了: master… worker---- worker---- worker---- worker---- worker---- worker---- worker---- worker----

在页面上访问,没有任何反应,最后页面访问失败;

============================================================

而下面这个代码就可以正常访问(把createServer放在前面),输出的结果也对,但用AB压了一下,发现用 1个子进程跟8个子进程基本上没有任何区别!

( 求解啊,这是为啥呢,是上面的程序哪里写的不对? 还是下面的代码还是相当于只用了一个子进程来处理请求?);

cup: 8核; 并发: 1000次 总请求:2000次

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

http.createServer(function(req, res){ console.log(’%s %s’, req.method, req.url); var body = ‘Hello World’; res.writeHead(200, { ‘Content-Length’: body.length }); res.end(body); }).listen(9000);

// 获取 CPU 的数量 var workers = {}; if (cluster.isMaster) { console.log(‘master…’); // 初始化 CPU 数量相同的工作进程 for (var i = 0; i < numCPUs; i++) { var worker = cluster.fork(); workers[worker.pid] = worker; }

// 主进程分支
cluster.on('death', function (worker) {
    // 当一个工作线程结束时,重新启动一个工作线程
    delete workers[worker.pid];
    worker = cluster.fork();
    workers[worker.pid] = worker;
});

} else { // 工作進进程分支,启动服务器 console.log(‘worker----’);

}

// 当主进程终止时,关闭所有工作进程 process.on(‘SIGTERM’, function () { for (var pid in workers) { process.kill(pid); } process.exit(0); });

4 回复

原因是:if (cluster.isMaster) 它一直为真,所以就没有运行到 http.createServer, 如果不是把http.createServer 放在第一行的话;

可是这是为什么呢? 难道网上的示例都是没有经过自己手动跑过的?

我找到问题了!@!~

是我自己的问题, sorry~

回到顶部