Python Web & Scripts — Django, FastAPI, скрипты
asyncio ломается не в коде, а в месте, где вы смешали ожидание и блокировку
Главная ошибка — считать, что async сам ускоряет всё подряд. Он хорошо работает там, где есть ожидание сети, диска, очереди или таймера. Как только внутри корутины появляется тяжёлый CPU-кусок, синхронный ORM-вызов или sleep из стандартной библиотеки, event loop начинает простаивать.
Есть три типовых правила:
— не вызывайте блокирующие функции из корутины без выноса в thread/process pool;
— не плодите задачи без лимита, иначе получите не скорость, а очередь и память;
— не путайте await с параллельностью: порядок выполнения решает планировщик, а не ваш список вызовов.
Если нужен контроль, стройте узкие места явно: ограничитель concurrency через Semaphore, таймауты на внешние запросы, отдельный пул для тяжёлых операций. Для интеграций это почти всегда важнее, чем «перевести всё на async».
Проверка простая: если убрать внешнее ожидание, а код почти не теряет время — asyncio вам нужен не для ускорения, а для управляемого I/O.
3 ·