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); });
原因是:if (cluster.isMaster) 它一直为真,所以就没有运行到 http.createServer, 如果不是把http.createServer 放在第一行的话;
可是这是为什么呢? 难道网上的示例都是没有经过自己手动跑过的?
我找到问题了!@!~
是我自己的问题, sorry~