Синхронизация рабочих потоков в узле 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, поэтому синхронизация становится тривиальной.
Взгляните на примеры в документации.