В чем отличие асинхронного подхода от синхронного
Что проверяют
Понимаете ли вы, что асинхронность в Python это не параллелизм, и знаете ли, когда она даёт выигрыш, а когда нет.
Как отвечать
В синхронном коде операции идут последовательно: пока выполняется запрос к базе или к внешнему сервису, поток стоит и ждёт. В асинхронном ожидание не блокирует: на await корутина отдаёт управление циклу событий, и он запускает другие готовые задачи.
Ключевые вещи, которые стоит проговорить:
- это конкурентность, а не параллелизм: один поток и один цикл событий выполняют много задач по очереди, переключаясь на точках ожидания. Ядра процессора при этом не загружаются параллельно;
- выигрыш там, где много ожидания ввода-вывода: сеть, диск, база. Тысяча одновременных HTTP-запросов через
asyncio.gatherотработает за время самого долгого, а не за сумму; - на вычислениях выигрыша нет: тяжёлый расчёт заблокирует цикл событий целиком. Для этого берут процессы (
ProcessPoolExecutor), а не корутины; - вся цепочка должна быть асинхронной: один синхронный вызов внутри корутины (обычный
requests, тяжёлыйtime.sleep, синхронный драйвер базы) останавливает всё приложение. Такие вызовы уносят вrun_in_executorили заменяют на асинхронные библиотеки; - цена: код сложнее отлаживать, стек вызовов менее очевиден, экосистема требует асинхронных аналогов (
httpx,asyncpg,SQLAlchemyв асинхронном режиме).
Полезно добавить, что альтернатива не всегда асинхронность: несколько процессов с синхронным кодом часто проще и достаточно быстры, а с появлением свободнопоточного режима картина будет меняться.
Где спотыкаются
Говорят «асинхронно значит параллельно» и не упоминают глобальную блокировку интерпретатора.
Ждут ускорения вычислений от asyncio.
Забывают, что забытый await возвращает корутину, а не результат, и код молча делает не то.