Sobes.tech
Middle
34

Kas Node.js on ühe lõngaga või mitte? Kui palju lõngu võib Node.js täidetav fail hõivata ja miks? Mis on libuv ja kuidas see on seotud sündmuste tsükliga?

Ettevõtted, kust küsiti
Evrone

Vastus AI-lt

sobes.tech AI

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, а основной поток не блокируется.