Назад к вопросам
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 кода.