在节点js中同步工作线程

时间:2019-01-28 09:41:41

标签: javascript node.js multithreading worker-thread

我有一些用于处理“工作线程”(Node js)的代码。在app.js循环中,当我将条件设置为i <100000000时,我的第二个线程不会在第一个线程未完成之前启动。 Node js中的同步线程如何工作?以及如何并行使用两个或更多线程?

const { Worker } = require('worker_threads');
const path = require('path');

const WORKERS_NUMBER = 2;

for (var i = 1; i <= WORKERS_NUMBER ; i++) {
  const w = new Worker(path.join(__dirname, './app.js'), { workerData: { id: i } });
  w.addListener("message",(message)=>{console.log(message);});
}

const { workerData, parentPort } = require('worker_threads');

const id = workerData.id;

console.log(`Worker ${id} initializad.`);
let i=0;
while (i<10) {
  i++;
  process.nextTick((i)=>{    
    parentPort.postMessage( `${id}:${i}` );
  },i);
}

1 个答案:

答案 0 :(得分:0)

您需要手动同步线程的执行。 您可以通过侦听从工作人员发送到主线程的特定消息,并使用计数器来知道何时所有线程都已完成,来做到这一点。

否则,您可以使用microjob库来轻松地将工作线程执行包装在Promise中,因此同步变得很简单。

看看docs内部的示例。