Проверяет понимание модели выполнения кода в Node.js и возможности возникновения гонок данных в однопоточной среде.
Node.js работает в одном потоке, но это не гарантирует отсутствие гонок данных. Гонка возникает, когда несколько асинхронных операций обращаются к общему ресурсу без должной синхронизации, и результат зависит от порядка их завершения. В однопоточной среде это происходит не из-за параллельного выполнения, а из-за переключений между операциями в event loop.
Event loop обрабатывает задачи последовательно, но асинхронные операции (например, чтение файла или запрос к БД) выполняются вне основного потока. Когда операция завершается, её колбэк попадает в очередь и выполняется позже. Между запуском операции и выполнением колбэка может произойти множество других операций, что создаёт окно для гонки.
let counter = 0;
function increment() {
setTimeout(() => {
counter++;
console.log(counter);
}, Math.random() * 100);
}
increment();
increment();
increment();
// Результат может быть 1, 2, 3 в любом порядке, но не всегда 3Здесь три вызова increment запускают таймеры с разными задержками. Порядок выполнения колбэков не гарантирован, поэтому counter может увеличиваться в произвольном порядке, хотя итоговое значение будет 3. Но если бы операции были более сложными (например, чтение и запись в файл), результат мог бы быть некорректным.
Особенно опасно при работе с общими ресурсами: файловые системы, базы данных, глобальные переменные. Например, два запроса к API могут одновременно обновлять один и тот же документ в MongoDB, и последняя запись перезапишет предыдущую, что приведёт к потере данных.
Гонки данных в Node.js реальны и требуют внимания. Понимание event loop и асинхронной природы помогает проектировать безопасные приложения. Используйте атомарные операции и минимизируйте общее состояние, чтобы избежать непредсказуемого поведения.