Node.js однопоточная или нет? Сколько потоков может занять исполняемый файл Node.js и почему? Что такое libuv и как он связан с event loop?
Answer from AI
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, а основной поток не блокируется.