Проверяет понимание однопоточной модели Node.js и того, какие операции способны остановить обработку событий и заморозить приложение.
Node.js выполняет JavaScript в одном потоке, а асинхронность обеспечивается за счёт Event Loop. Event Loop поочерёдно берёт задачи из очередей (timers, poll, check и т.д.) и выполняет их колбэки. Пока один колбэк не завершится, следующий не начнётся. Значит, любая долгая синхронная операция внутри колбэка блокирует весь цикл.
fs.readFileSync, crypto.pbkdf2Sync, child_process.execSync.JSON.parse на десятках мегабайт.const http = require('http');
http.createServer((req, res) => {
if (req.url === '/block') {
// Синхронный цикл на несколько секунд
let sum = 0;
for (let i = 0; i < 1e10; i++) sum += i;
res.end('done ' + sum);
} else {
res.end('fast');
}
}).listen(3000);
// Пока /block считается, запрос /fast тоже ждёт.Пока выполняется цикл на маршруте /block, сервер не отвечает даже на быстрый /fast, потому что Event Loop занят.
fs.promises.readFile вместо readFileSync.worker_threads или child_process.setImmediate или setTimeout, чтобы дать Event Loop обработать другие задачи.const { Worker } = require('worker_threads');
function runHeavy(data) {
return new Promise((resolve, reject) => {
const worker = new Worker('./heavy.js', { workerData: data });
worker.on('message', resolve);
worker.on('error', reject);
});
}
// Event Loop свободен, пока worker считает в отдельном потоке.Итог: блокировка Event Loop происходит из-за синхронных тяжёлых операций в основном потоке. Чтобы приложение оставалось отзывчивым, такие задачи нужно выносить в отдельные потоки или процессы и использовать асинхронные API.
Уровень
Рейтинг:
5
Сложность:
5
Навыки
JavaScript
Node.js
Ключевые слова
Подпишись на Node.js Developer в телеграм