@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" - это функция, которая выполняет тяжелую задачу. Она может быть заменена на любую другую функцию, которую необходимо выполнить в отдельном потоке.