Пожалуйста, объясните, почему однопоточный цикл событий в FastAPI не гарантирует корректность одновременного изменения общего словаря лимитов.

Один event loop последовательно исполняет участки кода, но coroutine могут чередоваться на await. Проверка лимита и его изменение, разделённые ожиданием, становятся гонкой даже в одном потоке.

Короткий ответ

Что ответить на собеседовании

Один event loop последовательно исполняет участки кода, но coroutine могут чередоваться на await. Проверка лимита и его изменение, разделённые ожиданием, становятся гонкой даже в одном потоке.

Подробный разбор

Ответ с пояснениями

Один event loop последовательно исполняет участки кода, но coroutine могут чередоваться на await. Проверка лимита и его изменение, разделённые ожиданием, становятся гонкой даже в одном потоке.

Две задачи могут прочитать одинаковый остаток, затем обе разрешить запрос. Для одного loop критическую секцию защищают asyncio.Lock или делают непрерываемой без await, если нет других способов доступа. Но FastAPI может работать с несколькими процессами и thread pool: обычный dict и локальный lock не объединяют их состояние. Для общего лимита нужна атомарная операция во внешнем хранилище. Нельзя выводить универсальную безопасность из наличия GIL.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее