Nodeでは、クラスタを簡単に実装できます。こんなに簡単でいいのか。
server.js
var cluster = require('cluster');
var http = require('http');
// CPUの数
var numCPUs = require('os').cpus().length;
if(cluster.isMaster) {
for(var i=0; i<numCPUs; i++) {
// マスターだったらforkします
var worker = cluster.fork();
console.log('worker forked: pid=' + worker.pid);
}
// worker終了時のイベントハンドラ
cluster.on('death', function(worker) {
console.log('worker ' + worker.pid + ' died');
});
}
else {
// サーバー起動
http.Server(function(req, res) {
res.writeHead(200);
res.end('Hello World\n');
}).listen(3000);
console.log('server started: http://localhost:3000/');
}
// node終了時に、forkしたworkerを終了します。
// これがないとworkerが終了しないです。
process.on('SIGINT', function() {
if(cluster.isMaster) {
console.log('master killed: pid=' + process.pid);
}
else {
console.log('worker killed: pid=' + process.pid);
}
process.exit(0);
});
実行結果(CPUが2つの場合)
$ node server.js worker forked: pid=18981 worker forked: pid=18982 server started: http://localhost:3000/ server started: http://localhost:3000/ ^Cmaster killed: pid=18980 worker killed: pid=18982 $ worker killed: pid=18981
起動後、Control+Cで終了すると、master→worker→workerの順に終了するのがわかります。
CPUを沢山お持ちの方は、負荷テストするとその効果がわかります。
0 件のコメント:
コメントを投稿