Этот вопрос проверяет, понимаете ли вы, когда узким местом становится ожидание внешних ресурсов и почему async помогает эффективнее использовать время выполнения.
Асинхронность нужна, когда сервис много времени ждёт: сеть, диск, база, очереди, сторонние API. В синхронной модели поток часто простаивает, потому что блокируется на I/O. В асинхронной модели во время ожидания можно обслуживать другие запросы в том же потоке. Это особенно полезно при большом количестве одновременных соединений и короткой CPU-работе. Если же основная нагрузка — вычисления, асинхронность почти не помогает.
Асинхронность полезна там, где время ответа определяется ожиданием, а не вычислениями. Важно различать I/O-bound и CPU-bound.
Асинхронная обработка — это подход, при котором выполнение задачи не блокируется на ожидании I/O, а управление возвращается циклу событий, чтобы выполнять другие задачи.
Обычно это ситуации, где на один входящий запрос приходится много внешних операций:
Много сетевых вызовов
запрос агрегирует данные из нескольких внешних HTTP-сервисов
нужно параллелить обращения (в пределах лимитов)
Много одновременных подключений
websocket / long polling
прокси/шлюзы, которые в основном “перекладывают” данные
Высокая доля ожидания
большая часть latency — DNS/TCP/TLS, ожидание ответа API, ожидание БД
Ограничение по потокам/процессам
нельзя бесконечно масштабировать пул потоков из-за памяти/контекста переключения
Перед началом списков важно зафиксировать идею: асинхронность ускоряет не отдельный запрос, а пропускную способность при ожидании I/O.
Снижение простаивания
пока один запрос ждёт внешнюю сеть, цикл событий обслуживает другие
Меньше накладных расходов
меньше потоков → меньше переключений контекста и памяти под стеки
import asyncio
async def fetch_a(): ...
async def fetch_b(): ...
async def handler():
a, b = await asyncio.gather(fetch_a(), fetch_b())
return {"a": a, "b": b}
CPU-heavy обработка
шифрование, сжатие, ML-инференс на CPU без offload
Мало конкурентности
редкие запросы или один внешний вызов без параллелизма
Блокирующие библиотеки
если клиент/драйвер блокирует поток, преимущества async исчезают (нужен async-драйвер или вынос в пул)
Асинхронность нужна, когда сервис массово ждёт I/O и вы хотите обслуживать больше запросов одновременно без раздувания числа потоков/процессов.