Приходилось ли работать с асинхронностью
Что проверяют
Понимаете ли вы, что именно ускоряет асинхронность в задачах с данными. Здесь узкое место обычно сеть и диск: выгрузка из внешнего API, чтение объектов из хранилища, запросы к базе. Интервьюер смотрит, отличаете ли вы такие задачи от счётных, где асинхронность не даёт ничего.
Как отвечать
Начните с разделения нагрузок:
- ожидание ввода-вывода: сотни запросов к API, выгрузка файлов, обращения к хранилищу. Здесь
asyncioсaiohttp, запуск пачкой черезasyncio.gatherи ограничение параллелизма черезasyncio.Semaphore; - счётная работа: парсинг, препроцессинг, обучение. Её уносят в процессы через
ProcessPoolExecutorлибо отдают библиотекам, которые сами отпускают GIL.
Полезно показать, что вы знаете границы. Блокирующий драйвер базы оборачивают в run_in_executor или берут асинхронный аналог. В пайплайне параллелизм чаще даёт оркестратор или движок обработки, и свой цикл событий внутри одной задачи там лишний. В сервисе инференса модель обычно синхронная, поэтому её вызов уводят в пул потоков, чтобы не морозить обработчик запросов.
Отдельно скажите про надёжность: таймаут на каждый запрос, повторы с выдержкой, корректная отмена задач, уважение к ограничению частоты со стороны источника.
Где спотыкаются
Ставят блокирующий вызов внутрь корутины. Один синхронный HTTP-клиент, time.sleep или тяжёлая операция над массивом останавливают весь цикл событий, и параллельность пропадает целиком, а не только в этой функции.
Запускают неограниченное число корутин. Десять тысяч одновременных запросов упираются в память, число сокетов и лимиты источника, и тот начинает отвечать отказами. Ограничение через семафор или обработка пачками нужны сразу, а не после первого инцидента.
Путают асинхронность с параллелизмом. Из-за GIL счётная нагрузка в одном процессе не ускорится ни корутинами, ни потоками. Рассказ о том, как asyncio ускорил обучение модели, интервьюер услышит как незнание базовых вещей.