Этап 2 из 18 · ≈ 10 ч

Асинхронный Python

Основа с Junior

asyncio для параллельных запросов к моделям и инструментам — без блокировок и утечек.

Запрос к LLM длится секунды. Сервис, который ждёт его синхронно, обслуживает единицы пользователей; асинхронный — сотни на одном процессе. Агенты и RAG тоже выигрывают: поиск по нескольким источникам и вызовы инструментов идут параллельно.

async def answer(question: str) -> str:
    async with asyncio.TaskGroup() as tg:
        docs = tg.create_task(search(question))
        profile = tg.create_task(load_profile(user_id))
    return await llm.complete(build_prompt(question, docs.result(), profile.result()))

Что важно знать

  • Блокирующий вызов (синхронный HTTP-клиент, time.sleep, тяжёлые вычисления) внутри async-функции останавливает весь event loop.
  • TaskGroup и gather — параллельный запуск; таймауты — asyncio.timeout.
  • Ограничение параллельности (Semaphore) — чтобы не упереться в лимиты провайдера.
  • Асинхронные клиенты: httpx.AsyncClient, асинхронные версии SDK.
  • Потоковые ответы — асинхронные генераторы (async for chunk in stream).

Критерии освоения

Junior ≈ 10 ч

  • Пишет async-функции и вызывает несколько запросов к модели параллельно через gather или TaskGroup
  • Объясняет, почему блокирующий вызов внутри async-функции останавливает весь сервис

Практика. Переписать скрипт, который последовательно отправляет 100 запросов к модели, на асинхронный с параллельностью 10 и сравнить время.

Middle ≈ 10 ч

  • Ограничивает параллельность семафором под лимиты провайдера
  • Обрабатывает таймауты и отмену задач без утечек соединений
  • Читает потоковый ответ модели асинхронным генератором и передаёт его клиенту

Практика. Сделать асинхронный клиент к двум провайдерам с таймаутом, повторами, семафором и переключением на резервного провайдера при ошибках.

Проверка знаний

Войдите, чтобы пройти тест: сданный тест отмечает тему пройденной на карте и в ИПР.

Вопросы с собеседований

Смотреть все
Как работают async и await?Junior

async def создаёт корутину, await — точка, где она отдаёт управление циклу событий, пока ждёт.

Полный разбор
Как устроен event loop в asyncio?Middle

Event loop — цикл в одном потоке: берёт готовые к выполнению задачи, выполняет каждую до ближайшего await, а ожидающие ввода-вывода передаёт ОС (epoll, kqueue) и возвращается к ним, когда данные пришли. Переключение кооперативное — только в точках await.

Полный разбор
Что будет, если внутри async-функции вызвать блокирующий код?Middle

Встанет весь event loop: блокирующий вызов (time.sleep, requests.get, синхронный драйвер БД, тяжёлое вычисление) не отдаёт управление, и все остальные задачи ждут. Решение — асинхронная библиотека (httpx, asyncpg, aiofiles) или вынос в поток…

Полный разбор
Чем asyncio.gather отличается от TaskGroup и как в них обрабатываются ошибки?Middle

Оба запускают корутины конкурентно. gather при первой ошибке пробрасывает её, но остальные задачи продолжают работать брошенными (если не return_exceptions=True). TaskGroup (3.11) — структурная конкурентность: ошибка в одной задаче отменяет остальные, блок…

Полный разбор
Как в asyncio работают отмена задач и таймауты?Middle

task.cancel() бросает CancelledError внутрь корутины в точке ближайшего await. Таймаут — asyncio.timeout() (3.11) или wait_for: по истечении задача отменяется, наружу — TimeoutError. CancelledError нельзя глотать: очистить ресурсы и пробросить дальше.

Полный разбор
Как запустить несколько корутин одновременно и получить их результаты?Junior

Точка входа — asyncio.run(main()): создаёт цикл событий и выполняет корутину. Несколько корутин одновременно запускают asyncio.gather(a(), b(), c()) — результаты приходят в том же порядке, что и корутины; с Python 3.11 — asyncio.TaskGroup. Если писать await…

Полный разбор
Чем отличаются threading, multiprocessing и asyncio?Junior

Потоки и asyncio — для ожидания ввода-вывода, процессы — для вычислений на нескольких ядрах.

Полный разбор
Что такое GIL?Junior

GIL — блокировка в CPython: байткод Python в один момент выполняет только один поток.

Полный разбор

← Вся карта «ИИ-инженер»

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования