Перейти к содержанию

Продвинутый проект: асинхронный API-сервис

Начало урока

Итоговый проект: асинхронный API-сервис

Параллельно получаем данные из многих источников, обрабатываем их и отдаём - единый сервис на asyncio.

Главная идея: реальный сервис большую часть времени ждёт - сетевых ответов, диска, других сервисов. asyncio позволяет одному потоку держать тысячи таких ожиданий одновременно и переключаться на то, что готово. В этом итоговом проекте мы строим небольшой, но приближённый к продакшену агрегатор котировок: он параллельно получает цены из нескольких внешних API, приводит их к типизированным записям, кэширует результаты с временем жизни (TTL) и отвечает на HTTP-запросы - переиспользуя типизацию, dataclasses, контекстные менеджеры, asyncio и профилирование из тем 1-15.
К концу темы вы сможете:
  • разбить сервис на слои получение -> обработка -> отдача вокруг одного цикла событий,
  • выполнять ввод-вывод параллельно через asyncio.gather и asyncio.TaskGroup,
  • ограничивать параллелизм через Semaphore и добавлять таймауты на каждый вызов,
  • владеть сетевыми ресурсами через асинхронный контекстный менеджер,
  • держать цикл отзывчивым, вынося CPU-нагрузку в run_in_executor,
  • профилировать сервис, чтобы доказать, куда реально уходит время.

1. Форма сервиса

Прежде чем писать код, определите границы. У нашего сервиса три обязанности, каждая - тонкий слой с чётким контрактом:

  • Получение - обращаемся к N внешним API по HTTP и возвращаем сырой JSON. Это чистый ввод-вывод и причина использовать async.
  • Обработка - превращаем разнородные сырые данные в единую типизированную форму (Quote). В основном лёгкая по CPU, изредка нет.
  • Отдача - принимаем запросы клиента, оркестрируем получение + обработку, кэшируем ответ и отвечаем.

Разделение означает, что каждый слой тестируется и профилируется отдельно, а замена, скажем, HTTP-клиента не затрагивает логику отдачи. Диаграмма ниже показывает один запрос, проходящий через цикл, пока три вызова к источникам выполняются одновременно.

Один цикл событий (один поток) Клиент запрос Слой отдачи обработчик + кэш проверка TTL источник A источник B источник C Обработка приведение к записям Quote три запроса пересекаются во времени - цикл ждёт их все сразу
Получение расходится веером; обработка объединяет; слой отдачи кэширует и отвечает.

Продолжите этот урок на YourAIZone

В полном уроке — объяснение целиком, разобранные примеры, частые ошибки, тесты с мгновенной проверкой и ИИ-репетитор. Начните сразу как гость или создайте аккаунт, чтобы сохранять прогресс.

В полном уроке

  • Объяснение целиком
  • Разобранные примеры
  • Частые ошибки и как их избежать
  • Тестовые вопросы: 15
  • ИИ-репетитор, который отвечает на вопросы по теме
  • Отслеживание прогресса для ученика, родителей и учителя