新手请教一个Nodejs cluster+http.request的问题?
新手请教一个Nodejs cluster+http.request的问题?
想做一个压测工具,比方说在一个简单代码中实现: http.get(“http://www.sohu.com”, function(res) { console.log("Got response: " + res.statusCode); }); 是可以运行OK的? 不知道为什么同样的代码在cluster中运行会有没有任何反应呢?是因为执行太快直接EXIT了吗? 请前辈们帮忙指点一下:
cluster的部分代码:
console.time(‘cluster’); if (cluster.isMaster) { for (var i= 0;i<numCPUs;i++) { cluster.fork(); } var i=numCPUs; cluster.on(‘exit’,function(worker,code,signal){ if (!–i) { console.timeEnd(‘cluster’); process.exit(0); }
});
} else { //console.log(fibo(40)); http.get(“http://www.sohu.com”, function(res) { console.log("Got response: " + res.statusCode); }); // console.log(cluster.worker.id +’:’ +testio()); process.exit(0); }
标准输出流没有跟主进程用同一个吧
大哥,这句话怎么理解?是要worker向process传参数吗?
在这个问题中,你想要在Node.js的cluster
模式下使用http.get
来发起HTTP请求。问题在于,在子进程中立即调用process.exit(0)
会导致进程在HTTP请求完成之前退出。
以下是一个改进后的示例代码,展示了如何在每个子进程中正确地处理HTTP请求,并在请求完成后退出子进程:
const cluster = require('cluster');
const http = require('http');
const numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
console.time('cluster');
for (let i = 0; i < numCPUs; i++) {
cluster.fork();
}
let remainingWorkers = numCPUs;
cluster.on('exit', worker => {
if (--remainingWorkers === 0) {
console.timeEnd('cluster');
process.exit(0);
}
});
} else {
http.get("http://www.sohu.com", res => {
console.log(`Worker ${cluster.worker.id}: Got response: ${res.statusCode}`);
// 当HTTP请求完成时,退出子进程
process.exit(0);
}).on('error', err => {
console.error(`Worker ${cluster.worker.id}: Error: ${err.message}`);
process.exit(1);
});
}
在这段代码中,我们在子进程中启动了一个HTTP GET请求,并在请求完成后或发生错误时退出子进程。主进程会等待所有子进程都完成后再结束自身。这样可以确保所有子进程都能正常处理HTTP请求并退出。