Назад к вопросам
Middle+
117
questionbank

Как реализуется многопоточность в Node.js?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Node.js по своей природе однопоточен для выполнения пользовательского JavaScript-кода. Многозадачность достигается за счет неблокирующего ввода/вывода и Event Loop. Многопоточность для выполнения тяжелых задач реализуется с помощью модуля worker_threads.

Event Loop:

  • Основной механизм для асинхронных операций.
  • Однопоточный цикл, который обрабатывает колбэки, связанные с I/O операциями, таймерами и другими асинхронными событиями.

Worker Threads:

  • Позволяют выполнять параллельно тяжелые CPU-bound задачи.
  • Каждый воркер запускает свой собственный JS-движок V8 в отдельном потоке.
  • Общение между основным потоком и воркерами происходит через передачу сообщений (postMessage, receiveMessage).

Сравнение:

Механизм Назначение Параллелизм Изоляция состояний Использование памяти Сложность Лучше подходит для
Event Loop Асинхронный I/O Конкурентность Общее состояние Эффективно Низкая I/O-bound задачи
Worker Threads CPU-bound вычисления Параллелизм Изолированное Выше Средняя CPU-bound задачи

Пример использования worker_threads:

// main.js
const { Worker, isMainThread, parentPort } = require('worker_threads');

if (isMainThread) {
  // Это основной поток
  const worker = new Worker(__filename); // Создаем воркер, использующий тот же файл

  worker.on('message', (msg) => {
    console.log(`Сообщение от воркера: ${msg}`);
  });

  worker.on('error', (err) => {
    console.error(err);
  });

  worker.on('exit', (code) => {
    if (code !== 0)
      console.error(`Воркер завершился с кодом ${code}`);
  });

  worker.postMessage('Привет, воркер!'); // Отправляем сообщение воркеру

} else {
  // Это поток воркера
  parentPort.on('message', (msg) => {
    console.log(`Сообщение от основного потока: ${msg}`);
    parentPort.postMessage('Привет, основной поток!'); // Отправляем сообщение обратно
  });
}

Event Loop управляется на уровне Node.js и libuv, тогда как worker_threads предоставляют API для явного создания и управления потоками для выполнения JavaScript кода.