Как организовать очередь потоков (worker_threads) в node.js?

Пользователь

от montana_hand , в категории: JavaScript , 8 месяцев назад

Как организовать очередь потоков (worker_threads) в node.js?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

1 ответ

Пользователь

от magali , 8 месяцев назад

@montana_hand 

Для организации очереди потоков в Node.js можно использовать модуль "worker_threads".


Пример кода:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
const { Worker, isMainThread } = require('worker_threads');
const queue = [];

if (isMainThread) {
  // Функция, которая добавляет задачу в очередь
  const addToQueue = (task) => {
    queue.push(task);
    runNextTask();
  }

  // Функция, которая запускает следующую задачу из очереди
  const runNextTask = () => {
    if (queue.length > 0) {
      const task = queue.shift();
      const worker = new Worker('./worker.js', { workerData: task });
      worker.on('message', (result) => {
        console.log('Task completed:', result);
        runNextTask();
      });
      worker.on('error', (error) => {
        console.error('Worker error:', error);
      });
      worker.on('exit', (code) => {
        if (code !== 0) {
          console.error('Worker stopped with exit code:', code);
        }
      });
    }
  };

  addToQueue({ data: 'task1' });
  addToQueue({ data: 'task2' });
} else {
  // Файл worker.js
  const { workerData, parentPort } = require('worker_threads');
  const result = doHeavyWork(workerData);
  parentPort.postMessage(result);
}

// Функция, которая выполняет тяжелую задачу
function doHeavyWork(data) {
  // ...
  return result;
}


В данном примере для добавления задачи в очередь используется функция "addToQueue", которая добавляет новую задачу в массив "queue" и запускает функцию "runNextTask", если очередь не пуста.


Функция "runNextTask" извлекает первую задачу из очереди и создает новый worker_thread для ее выполнения. По завершении задачи worker_thread отправляет результат функции "doHeavyWork" обратно главному потоку через событие "message".


Если в worker_thread происходит ошибка, она будет обработана событием "error". Также в коде предусмотрена обработка события "exit", которое сигнализирует об остановке worker_thread.


Функция "doHeavyWork" - это функция, которая выполняет тяжелую задачу. Она может быть заменена на любую другую функцию, которую необходимо выполнить в отдельном потоке.