先上代码:
const {
isMainThread,
parentPort,
workerData,
threadId,
MessageChannel,
MessagePort,
Worker
} = require('worker_threads');
var child_process = require('child_process');
var most = Number(process.argv.slice(2)[0]) || 2; //最大线程数
var testNum = Number(process.argv.slice(2)[1]) || 100; // 每条线程请求数
var beginTime = []; // 开始时间
var endTime= []; // 结束时间
var earliestStartTime = null; // 最早开始时间
var latestEndTime = null; // 最晚结束时间
var overNum = 0; // 线程结束次数
function mainThread() {
for (let i = 0; i < most; i++) {
const worker = new Worker(__filename, { workerData: i }); // 创建工作线程
worker.on('exit', code => { // 工作线程使用完退出事件
overNum ++;
console.log(`main: worker stopped with exit code ${code}`);
if (overNum === most) { // 最后一个线程结束时的输出信息
if (beginTime.length > 1) { // 开始时间排序
beginTime.sort(function (a, b) {
return a-b;
});
earliestStartTime = beginTime[0]; // 最早开始时间--取最小值
} else {
earliestStartTime = beginTime[0]; // 只有一个线程的情况
}
if (endTime.length > 1) { // 结束时间排序
endTime.sort(function (a, b) {
return a-b;
});
latestEndTime = endTime[endTime.length - 1]; // 最晚结束时间--取最大值
} else {
latestEndTime = endTime[0]; // 只有一个线程的情况
}
console.log('各线程起始时间:' + beginTime);
console.log('各线程结束时间:' + endTime);
console.log('历时:' + (latestEndTime - earliestStartTime) / 1000 + ' s');
console.log('TPS:' + (most * testNum)/((latestEndTime - earliestStartTime) / 1000));
console.log('单次请求耗时:' + (latestEndTime - earliestStartTime) / (most * testNum) + ' ms');
console.log('--------------------------------');
}
});
worker.on('message', msg => { // 主线程接收数据传递事件
if (msg) {
if (msg.begin) {
beginTime.push(msg.begin); // 把起始时间压入数组中
} else if (msg.end) {
endTime.push(msg.end); // 把结束时间压入数组中
}
}
});
}
}
function workerThread() {
console.log(`worker: workerDate ${workerData}`);
for (let j = 0; j < testNum; j ++) {
if (j === 0) { // 如果刚开始跑测试用例
let begin = Number(new Date().valueOf());
parentPort.postMessage({begin: begin}); // 传递数据到主线程
}
child_process.exec('/data/app/mysqlsec/bin/newTest.sh', function (err, stdout, stderr) {
if ((err && err !== '') || (stderr && stderr !== '')) {
console.log('错误:' + err);
console.log('值错误:' + stderr);
if (j >= (testNum -1)) { // 如果运行到最后一个
let end = Number(new Date().valueOf());
parentPort.postMessage({end: end}); // 传递数据到主线程
}
}
if (stdout && stdout !== '') {
// console.log('结果:' + stdout);
if (j >= (testNum -1)) { // 如果运行到最后一个
let end = Number(new Date().valueOf());
parentPort.postMessage({end: end}); // 传递数据到主线程
}
}
});
}
}
if (isMainThread) {
mainThread();
} else {
workerThread();
}
我定义most和testNum是可以在执行node xxx.js X Y
的时候获取传入的参数值,这运行到主线程mainThread()
的时候都还好,值还是在的,也是传来的那个。但是,到了主线程开始创建工作线程new worker()
和执行workerThread()
的时候,testNum就变了,变回默认值100,同时process.argv
里面也没有most和testNum的传入值了。
这怎么处理?我想要执行node 传入的参数一直都存在,这该如何是好?
通过
workerData
来传值。原代码:
`const worker = new Worker(__filename, { workerData: i }); // 创建工作线程
`
现代码:
const worker = new Worker(__filename, { workerData: [currentThread + 1, loopTotal] }); // 创建工作线程
然后,在工作分支通过
workerData[index]
来调用。=> workerData[1] = loopTotal