AI написал async-код, но сервер зависает: проверьте блокирующие вызовы

Ключевое слово async не делает каждую операцию внутри функции неблокирующей. Если сгенерированный обработчик вызывает синхронное ожидание или тяжёлый SDK в потоке event loop, другие задачи могут перестать получать управление.

Пример из разработки

Агент добавил асинхронный обработчик проверки статуса. Внутри стоит time.sleep между попытками, потому что пример из обычного скрипта выглядел подходящим. Один тестовый запрос успешно завершается. Но второй пользователь и проверка доступности сервера ждут вместе с ним: цикл событий не может выполнять соседнюю работу во время блокирующего ожидания. Низкая нагрузка в одиночном тесте скрыла проблему конкурентного выполнения.

Почему это работает

Для обычной асинхронной задержки используйте await asyncio.sleep. Для действительно блокирующего ввода-вывода выберите подходящий асинхронный клиент или предусмотренный механизм выноса работы, например asyncio.to_thread там, где он применим. Это не универсальное решение CPU-нагрузки и не гарантия отмены внешнего вызова. Проверьте библиотеку: метод с привычным именем request может быть синхронным. Ревью должно проследить фактический вызов, а не ограничиться наличием async def на верхнем уровне.

Проверка перед использованием

ПроверкаОжидаемое поведение
Один запрос ожидает ответ внешнего источникаПараллельный лёгкий запрос продолжает обслуживаться в пределах согласованного времени, а не ждёт весь чужой сетевой вызов.
Искусственная пауза внутри обработчикаСравнение блокирующего и асинхронного ожидания показывает различие в прогрессе соседней задачи без обращения к реальным сервисам.
Отмена задачи с вынесенным синхронным вызовомСтатус внешней операции проверяется отдельно: прекращение ожидания корутины не выдаётся за гарантированную остановку потока и побочного эффекта.

Этот тест локализует блокировку event loop, но не доказывает готовность сервера к любой нагрузке. Пулы соединений, число потоков, ограничения CPU и внешние квоты проверяются отдельно. Не лечите каждый медленный запрос автоматическим добавлением потоков.

При работе с coding agent важно уметь проверять конкурентное поведение сгенерированной реализации, а не только её успешный одиночный запуск. В платном курсе Vibecoding: Claude Code, Codex, Cursor и agentic development можно продолжить изучение соответствующего инженерного направления. Перед покупкой сравните программу и открытые материалы со своей задачей.

Документация для проверки технических деталей: Корутины и задачи asyncio.

Следующий шаг: AI-разработка: разборы ошибок, изменений и проверки кода. По смежным вопросам: AI написал тесты из моков: что они действительно проверяют, AI повторил скриншот, но интерфейс неудобен: как принимать UI.