Коротка відповідь
juniorNode.js — це однопотокова платформа, оскільки її ядро V8 працює в одному потоці, а event loop обробляє асинхронні операції без блокування. Багатопотоковість реалізується через worker threads або child processes, але основний цикл залишається однопотоковим для простоти та продуктивності.
Повне пояснення
Що це і навіщо
Node.js розроблений як однопотокова платформа, щоб уникнути накладних витрат на створення та синхронізацію потоків. Це дозволяє швидко обробляти великі кількості одночасних з’єднань, використовуючи неблокуючий I/O.
Ключові принципи
- Event loop: центральний цикл, що обробляє колбек-функції.
- Non-blocking I/O: асинхронні операції (fs, net, http) виконуються в окремих потоках системи, але результати повертаються у головний цикл.
- Worker threads: модуль
worker_threadsдозволяє створювати окремі потоки для CPU‑intensive задач.
Як це працює
- Запускається один головний потік, що виконує JavaScript код.
- При асинхронному виклику (наприклад,
fs.readFile) Node передає задачу в системний пул потоків. - Коли операція завершується, результат повертається в event loop і виконується відповідний колбек.
Практика та реалізація
import { Worker } from 'worker_threads';
const worker = new Worker('./heavyTask.js');
worker.on('message', result => console.log(result));
Тестування
Для тесту worker‑thread можна використати Jest:
test('worker returns correct result', async () => {
const worker = new Worker('./heavyTask.js');
const result = await new Promise(resolve => worker.on('message', resolve));
expect(result).toBe(42);
});
Безпека та масштабування
- Проблема: однопотоковість може стати вузьким місцем при CPU‑intensive задачах.
- Рішення: розподілити роботу між worker‑threads або child processes, використовуючи кластерний режим (
clusterмодуль).
Чому Node.js не багатопотоковий за замовчуванням
- Простота: однопотокова модель зменшує складність синхронізації.
- Продуктивність: неблокуючий I/O дозволяє обробляти тисячі з’єднань без створення потоків.
- Підтримка: більшість бібліотек та інструментів орієнтовані на однопотокову модель, що спрощує розробку.
Альтернативи
- Cluster: створює кілька процесів Node, кожен із власним event loop.
- Worker threads: дозволяє виконувати CPU‑intensive код у окремих потоках.
- External services: розподілити обчислення на мікросервіси, написані іншими мовами (наприклад, Go, Rust).