Синхронизация рабочих потоков в узле JS

У меня есть код для игры с "рабочими потоками" (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);
}

0 ответов

Вам необходимо вручную синхронизировать выполнение потоков. Вы можете сделать это, прослушивая определенное сообщение, которое вы отправляете от рабочих к основному потоку, и используя счетчик, чтобы узнать, когда все потоки выполнены.

В противном случае вы можете использовать библиотеку микрозаданий, которая легко помещает выполнение рабочего потока в Promise, поэтому синхронизация становится тривиальной.

Взгляните на примеры в документации.

Другие вопросы по тегам