nodejs 多线程循环怎么写?

发布于 2022-09-12 02:23:02 字数 6530 浏览 11 评论 0

请问,我下面写的这两个代码,哪个是多线程执行的呢?

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

仄言 2022-09-19 02:23:02

最后,还是使用了worker_threads来完成。

去nodejs的官网按照“linux下载安装”步骤,一点一点的完成了nodejs的版本更新,然后就使用worker_threads来实现了,之前耗费了2星期的脑力。这个用几个小时就搞定了...无语。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文