nodejs 多线程循环怎么写?
请问,我下面写的这两个代码,哪个是多线程执行的呢?
var child_process = require('child_process');
var most = Number(process.argv.slice(2)[0]) || 5; //最大线程数
var testNum = Number(process.argv.slice(2)[1]) || 1000; // 每条线程请求数
var sucessNum = 0; // 成功数
var failNum = 0; // 失败数
var beginTime = null; // 起始时间
var endTime = null; // 结束时间
var doNum = 0; // 执行数
function foo(start) {
console.log(most + ' ----- ' +testNum);
for (let i = 0; i< most; i++) {
setTimeout(function () {
for (let j = 0; j < testNum; j ++) {
child_process.exec('/data/app/mysqlsec/bin/newTest.sh', function (err, stdout, stderr) {
if (doNum === 0) {
beginTime = Number(new Date().valueOf());
}
if ((err && err !== '') || (stderr && stderr !== '')) {
failNum ++;
}
if (stdout && stdout !== '') {
sucessNum ++;
}
doNum ++;
if (doNum === (testNum * most)) {
endTime = Number(new Date().valueOf());
console.log('线程数:' + i);
console.log('输出:' + stdout);
console.log('错误:' + err);
console.log('值错误:' + stderr);
console.log('成功数:' + sucessNum);
console.log('失败数:' + failNum);
console.log('开始时间:' + beginTime);
console.log('结束时间:' + endTime);
console.log('历时:' + (endTime - beginTime) / 1000 + ' s');
console.log('TPS:' + sucessNum/((endTime - beginTime) / 1000));
console.log('单次请求耗时:' + (endTime - beginTime) / (most * testNum) + ' ms');
console.log('--------------------------------------------------');
}
});
}
}, i*100);
}
}
foo(0);
上面这个执行的时候,只有一个node进程和多个child_process.exec执行的脚本进程,而且脚本进程执行完后会有残留。我的老大说我这个代码不对,因为如果线程是5个话,脚本进程不应该会超过5个才对。
然后,我这里又写了一个,可以根据计算机的内核来新增node进程,同时执行完的时候也会把所有脚本进程也关掉,不会有残留。但是,随着线程数增加,TPS会越来越低,我也怀疑我写的不对。(而且,这里也没有执行完就关闭进程的代码。执行完就会停在那里,需要ctrl+c关掉)
const cluster = require('cluster');
const numCPUs = require('os').cpus().length;
var child_process = require('child_process');
var seconds = 0; // 计秒数
var most = 1; //最大线程数
var testNum = 1000; // 每条线程请求数
var sucessNum = 0; // 成功数
var failNum = 0; // 失败数
var beginTime = null; // 起始时间
var endTime = null; // 结束时间
var doNum = 0; // 执行数
// 主进程 + 4个工作进程 = 5个进程
if (cluster.isMaster) {
console.log(`主进程 ${process.pid} 正在运行`);
for (let i = 0; i< most; i++) {
setTimeout(function () {
seconds++;
for (let j = 0; j < testNum; j ++) {
child_process.exec('/data/app/mysqlsec/bin/newTest.sh', function (err, stdout, stderr) {
if (doNum === 0) {
beginTime = Number(new Date().valueOf());
}
if ((err && err !== '') || (stderr && stderr !== '')) {
failNum ++;
}
if (stdout && stdout !== '') {
sucessNum ++;
}
doNum ++;
if (doNum === (testNum * most)) {
endTime = Number(new Date().valueOf());
console.log(`这是进程${process.pid}`);
console.log('线程数:' + i);
console.log('输出:' + stdout);
console.log('错误:' + err);
console.log('值错误:' + stderr);
console.log('成功数:' + sucessNum);
console.log('失败数:' + failNum);
console.log('开始时间:' + beginTime);
console.log('结束时间:' + endTime);
console.log('历时:' + (endTime - beginTime) / 1000 + ' s');
console.log('TPS:' + sucessNum/((endTime - beginTime) / 1000));
console.log('单次请求耗时:' + (endTime - beginTime) / (most * testNum) + ' ms');
console.log('--------------------------------------------------');
}
});
}
}, i*100);
}
// 衍生工作进程。
for (let i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on('exit', (worker, code, signal) => {
console.log(`工作进程 ${worker.process.pid} 已退出`);
});
} else {
for (let i = 0; i< most; i++) {
setTimeout(function () {
seconds++;
for (let j = 0; j < testNum; j ++) {
child_process.exec('/data/app/mysqlsec/bin/newTest.sh', function (err, stdout, stderr) {
if (doNum === 0) {
beginTime = Number(new Date().valueOf());
}
if ((err && err !== '') || (stderr && stderr !== '')) {
failNum ++;
}
if (stdout && stdout !== '') {
sucessNum ++;
}
doNum ++;
if (doNum === (testNum * most)) {
endTime = Number(new Date().valueOf());
console.log(`这是进程${process.pid}`);
console.log('线程数:' + i);
console.log('输出:' + stdout);
console.log('错误:' + err);
console.log('值错误:' + stderr);
console.log('成功数:' + sucessNum);
console.log('失败数:' + failNum);
console.log('开始时间:' + beginTime);
console.log('结束时间:' + endTime);
console.log('历时:' + (endTime - beginTime) / 1000 + ' s');
console.log('TPS:' + sucessNum/((endTime - beginTime) / 1000));
console.log('单次请求耗时:' + (endTime - beginTime) / (most * testNum) + ' ms');
console.log('--------------------------------------------------');
}
});
}
}, i*100);
}
console.log(`工作进程 ${process.pid} 已启动`);
}
各位js、nodejs大佬,可以帮忙看一下吗?执行脚本那个我就不放上来了。
哪个才是对的呢?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
最后,还是使用了worker_threads来完成。
去nodejs的官网按照“linux下载安装”步骤,一点一点的完成了nodejs的版本更新,然后就使用worker_threads来实现了,之前耗费了2星期的脑力。这个用几个小时就搞定了...无语。