Что такое ThreadPool в Node.js?

«Что такое ThreadPool в Node.js?» — вопрос из категории Node.js Core, который задают на 26% собеседований Node.js Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

ThreadPool в Node.js — это набор рабочих потоков (worker threads), управляемых библиотекой libuv, которая лежит в основе его асинхронной архитектуры. Он предназначен для выполнения операций, блокирующих ввод-вывод (I/O) или требующих интенсивных вычислений (CPU-bound), чтобы не блокировать основной поток Event Loop.

Ключевые моменты:

  • Размер по умолчанию: 4 потока. Его можно увеличить, установив переменную окружения UV_THREADPOOL_SIZE (например, UV_THREADPOOL_SIZE=8).
  • Какие операции используют ThreadPool: Некоторые функции из встроенных модулей, такие как:
    • fs (часть файловых операций, например, fs.readFile)
    • crypto (например, crypto.pbkdf2, crypto.randomBytes)
    • dns.lookup() (но не dns.resolve)
    • zlib (синхронные и асинхронные API)

Пример использования (модуль crypto):

const crypto = require('crypto');

// Эта операция будет делегирована в ThreadPool
crypto.pbkdf2('myPassword', 'salt', 100000, 64, 'sha512', (err, derivedKey) => {
  if (err) throw err;
  console.log('Хэш пароля:', derivedKey.toString('hex'));
});

// Event Loop продолжает работать, пока вычисляется хэш
console.log('Этот лог выведется сразу');

Важно: ThreadPool — это не то же самое, что модуль worker_threads. worker_threads предназначен для создания изолированных потоков JavaScript для выполнения настоящих CPU-интенсивных задач на JavaScript-коде, в то время как ThreadPool — это внутренний механизм libuv для оптимизации определенных системных операций.