Python Web & Scripts — Django, FastAPI, скрипты
asyncio ломается не там, где await забыли, а там, где смешали блокировки и гонки
В Python async помогает держать много I/O-задач без лишних потоков, но не делает код «быстрым сам по себе». Если внутри корутины есть sync-вызов, долгий CPU-цикл или скрытая блокировка, event loop замирает, а остальные задачи ждут.
Проверьте три места:
• сетевые клиенты и драйверы — должны быть реально async, а не обёрткой над sync;
• тяжёлые вычисления — выносите в process pool или отдельный worker;
• общие объекты — защищайте lock’ами, иначе ловите race condition даже без потоков.
Ещё один частый провал — бесконтрольный create_task. Если задачу не сохранить, не дождаться и не обработать исключение, ошибки исчезают в тишину. Для фоновых работ нужен явный список задач, отмена по shutdown и сбор результатов через gather или as_completed.
Если коротко: в asyncio важно не «писать await везде», а убирать блокировки, ограничивать конкурентность и заранее продумывать отмену. Тогда async даёт предсказуемую нагрузку, а не красивую иллюзию параллельности.
2 ·