Блокирующий I/O останавливает вызывающий поток, пока операция не завершится; неблокирующий I/O возвращается немедленно и позволяет потоку делать другую работу, пока операция завершается. Sync против async описывает ту же идею на уровне API.
Блокирующий I/O останавливает вызывающий поток, пока операция не завершится; неблокирующий I/O возвращается немедленно и позволяет потоку делать другую работу, пока операция завершается. Sync против async описывает ту же идею на уровне API.
read(), пока не придут данные. Просто, но поток всё это время простаивает — чтобы обслужить N медленных клиентов, нужно N потоков.Блокирующий: ──[ ждём диск ]── (поток застрял, ничего не делает)
Неблокирующий: ──▶ возвращается сейчас; event loop уведомлён, когда готово
// Блокирующий: ничего больше не выполняется, пока файл не прочитан
const data = fs.readFileSync('big.txt');
// Неблокирующий: поток продолжает работу; колбэк срабатывает позже
fs.readFile('big.txt', (err, data) => { /* обработать позже */ });
// или async/await поверх неблокирующих примитивов
const data2 = await fs.promises.readFile('big.txt');
Это ядро масштабируемых серверов. Node.js и nginx обрабатывают огромное число соединений на немногих потоках именно потому, что I/O неблокирующий — ожидание не занимает поток. Используйте блокирующие вызовы ради простоты в скриптах; используйте неблокирующие для высококонкурентных сетевых сервисов и никогда не блокируйте event loop тяжёлой CPU-работой.
Библиотека вопросов для IT-собеседований с подробными ответами — от Junior до Senior.
Поддержать