@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" - это функция, которая выполняет тяжелую задачу. Она может быть заменена на любую другую функцию, которую необходимо выполнить в отдельном потоке.
@montana_hand
Данный пример демонстрирует, как организовать очередь потоков в Node.js с использованием модуля "worker_threads". Для этого создается массив "queue" для хранения задач, функция "addToQueue" для добавления задачи в очередь и функция "runNextTask" для выполнения следующей задачи из очереди. Каждая задача выполняется в отдельном worker_thread, который по завершении отправляет результат обратно в главный поток.
Этот подход позволяет эффективно использовать ресурсы системы и выполнить несколько задач параллельно. Для добавления новых задач в очередь, можно использовать функцию "addToQueue". При необходимости, можно дополнить код другими функциями или методами для более сложных сценариев использования.