Sobes.tech
Middle
31

Ist Node.js ein Single-Thread oder nicht? Wie viele Threads kann eine Node.js-Executable-Datei beanspruchen und warum? Was ist libuv und wie hängt es mit der Event-Loop zusammen?

Unternehmen wurden gefragt
Evrone

Antwort von AI

sobes.tech KI

Node.js в своей основе однопоточный, то есть JavaScript код выполняется в одном основном потоке. Однако, исполняемый файл Node.js может использовать несколько потоков благодаря внутреннему механизму libuv, который управляет пулом потоков для выполнения асинхронных операций, таких как файловый ввод-вывод, DNS-запросы, и другие задачи, не поддерживаемые напрямую event loop.

По умолчанию libuv создает пул из 4 рабочих потоков, но это число можно изменить через переменную окружения UV_THREADPOOL_SIZE (максимум 128).

Event loop — это цикл событий, который обрабатывает асинхронные операции и колбэки в основном потоке. Libuv обеспечивает низкоуровневую абстракцию для работы с операционной системой, включая управление этим event loop и пулом потоков для выполнения тяжёлых или блокирующих задач вне основного потока.

Пример: когда вы вызываете асинхронное чтение файла, libuv ставит эту операцию в пул потоков, а event loop продолжает обрабатывать другие события. Когда чтение завершается, результат возвращается в основной поток через callback.

const fs = require('fs');

fs.readFile('file.txt', 'utf8', (err, data) => {
  if (err) throw err;
  console.log(data);
});

console.log('Чтение файла запущено');

Здесь чтение файла происходит в пуле потоков libuv, а основной поток не блокируется.