1
我試圖瞭解如何由羣集的工作人員提供http請求。我從http://nodejs.org/api/cluster.html的代碼開始,並添加了一些日誌記錄。在羣集中使用http.createServer時,爲什麼會向多次調用的http.createServer提供回調?
我把下面的代碼在server.js與執行的文件: NODE_DEBUG =羣集節點server.js
var cluster = require('cluster');
var http = require('http');
var numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
console.log('number of CPUs: ' + numCPUs);
// Fork workers.
for (var i = 0; i < numCPUs; i++) {
console.log('forking worker ' + i);
cluster.fork();
}
cluster.on('exit', function(worker, code, signal) {
console.log('worker ' + worker.process.pid + ' died');
});
} else {
console.log('worker spawned: ' + cluster.worker.process.pid);
var someVar = {'b': 1};
// Workers can share any TCP connection
// In this case its a HTTP server
http.createServer(function(req, res) {
console.log('someVar.b current value: ' + someVar.b + ". someVar.b will be incremented");
someVar.b = someVar.b + 1;
console.log('Request being processed by worker: ' + cluster.worker.process.pid);
res.writeHead(200);
res.end("hello world\n");
console.log('response ended by worker: ' + cluster.worker.process.pid);
}).listen(8000);
}
然後我去爲localhost:8000一次,你瞧,「你好世界「是我的預期。我沒想到的是正在打印兩次一些日誌語句:
number of CPUs: 2
forking worker 0
forking worker 1
535,Master Worker 536 online
535,Master Worker 537 online
worker spawned: 536
worker spawned: 537
someVar.b current value: 1. someVar.b will be incremented
Request being processed by worker: 536
response ended by worker: 536
someVar.b current value: 2. someVar.b will be incremented
Request being processed by worker: 536
response ended by worker: 536
具體來說,我預計對一個請求到我的服務器,下面的線將只打印一次:
someVar.b current value: X. someVar.b will be incremented
Request being processed by worker: XXX
response ended by worker: XXX
相反我的功能被同一工作人員執行兩次。請問有人可以解釋一下嗎?
賓果。謝謝。 – 2014-10-22 04:16:43