node 的worker_threads变量传值问题?

先上代码:

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 传入的参数一直都存在,这该如何是好?

阅读 3.4k
1 个回答

通过workerData来传值。

原代码:
`const worker = new Worker(__filename, { workerData: i }); // 创建工作线程
`

现代码:
const worker = new Worker(__filename, { workerData: [currentThread + 1, loopTotal] }); // 创建工作线程

然后,在工作分支通过workerData[index]来调用。=> workerData[1] = loopTotal

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题