Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- "use strict"
- const { Worker } = require("worker_threads");
- let inArr = []; // массив одинаковый для всех воркеров - передаём при создании.
- let arr = []; // массив значений, обрабатываемых воркерами, передаём через postMessage
- for(let i = 0; i < 100; i++){
- inArr[i] = 10 + randomInt(40);
- arr[i] = 20 + randomInt(30);
- }
- let a = []; // резульаты работы воркеров
- const workersNum = 4;
- let pool = []; // пул воркеров
- let freeWorkers = []; // индексы свободных воркеров
- let arrIndex = 0;
- let endFlag = false; // показывает окончание расчётов. нужен, что бы onReady иногда не вызывалась несколько раз.
- for (let i = 0; i < workersNum; i++){
- pool[i] = new Worker('./w.js', {workerData:{id: i, arr: inArr}});
- pool[i].on('message',function(message){
- if (message === "ready"){
- freeWorkers.push(i); // если воркер освободился, добавляем в список свободных
- doWork(); // и нагружаем работой
- }else{
- a.push(message.data); // собираем результаты работы воркеров.
- }
- });
- pool[i].on('error', function(error){
- console.log(error)
- });
- pool[i].on('exit', (code) => {
- if (code !== 0){
- console.log(new Error(`Worker stopped with exit code ${code}.`));
- }
- });
- }
- function onReady(){
- a.sort();
- console.log(a);
- }
- function doWork(){
- if (arrIndex < arr.length){ // если работа есть
- pool[ freeWorkers.pop() ].postMessage( arr[arrIndex] );
- arrIndex += 1;
- }else{ // если она закончилась
- stopWorks();
- }
- }
- function stopWorks(){
- for (let i = 0; i < workersNum; i++){
- pool[i].postMessage("exit");
- }
- if (!endFlag){
- endFlag = true;
- onReady();
- }
- }
- function randomInt(max) {
- return Math.floor(Math.random() * max);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement