Advertisement
Guest User

main_tread

a guest
Jan 24th, 2021
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. "use strict"
  2.  
  3. const { Worker } = require("worker_threads");
  4.  
  5. let inArr = []; // массив одинаковый для всех воркеров - передаём при создании.
  6. let arr = [];   // массив значений, обрабатываемых воркерами, передаём через postMessage
  7.  
  8. for(let i = 0; i < 100; i++){
  9.   inArr[i] = 10 + randomInt(40);
  10.   arr[i] = 20 + randomInt(30);
  11. }
  12.  
  13. let a = [];                     // резульаты работы воркеров
  14.  
  15. const workersNum = 4;
  16. let pool = [];                  // пул воркеров
  17. let freeWorkers = [];           // индексы свободных воркеров
  18. let arrIndex = 0;              
  19. let endFlag = false;            // показывает окончание расчётов. нужен, что бы onReady иногда не вызывалась несколько раз.
  20.  
  21. for (let i = 0; i < workersNum; i++){
  22.   pool[i] = new Worker('./w.js', {workerData:{id: i, arr: inArr}});
  23.  
  24.   pool[i].on('message',function(message){
  25.     if (message === "ready"){
  26.       freeWorkers.push(i);        // если воркер освободился, добавляем в список свободных
  27.       doWork();                   // и нагружаем работой
  28.     }else{
  29.       a.push(message.data);       // собираем результаты работы воркеров.
  30.     }
  31.   });
  32.  
  33.   pool[i].on('error', function(error){
  34.     console.log(error)
  35.   });
  36.  
  37.   pool[i].on('exit', (code) => {
  38.     if (code !== 0){
  39.       console.log(new Error(`Worker stopped with exit code ${code}.`));
  40.     }
  41.   });
  42. }
  43.  
  44. function onReady(){
  45.   a.sort();
  46.   console.log(a);
  47. }
  48.  
  49. function doWork(){
  50.   if (arrIndex < arr.length){                                 // если работа есть
  51.     pool[ freeWorkers.pop() ].postMessage( arr[arrIndex] );
  52.     arrIndex += 1;
  53.   }else{                                                      // если она закончилась
  54.     stopWorks();
  55.   }
  56. }
  57.  
  58. function stopWorks(){
  59.   for (let i = 0; i < workersNum; i++){
  60.     pool[i].postMessage("exit");
  61.   }
  62.   if (!endFlag){
  63.     endFlag = true;
  64.     onReady();
  65.   }
  66. }
  67.  
  68. function randomInt(max) {
  69.   return Math.floor(Math.random() * max);
  70. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement