FastAPI - это относительно новый веб-фреймворк для Python, вдохновленный такими веб-фреймворками, как Flask, Django. FastAPI построен на основе Starlette и предлагает массу потрясающих функций.

В последнее время он приобрел значительную популярность, и, потратив последние 6 месяцев на ежедневную работу с ним, я могу сказать, что шумиха оправдана. Сегодня я представляю вам одну из основных функций, которые FastAPI предоставляет разработчикам для выполнения асинхронных задач прямо на уровне API.

Используя BackgroundTasks, вы можете запускать длительные процессы, задачи или функции, которые запускаются после возврата ответа. Таким образом, ваше клиентское приложение не ждет завершения задачи. Несколько сценариев, в которых это может помочь -

  1. Отправка уведомления по электронной почте после обработки API.
  2. Отправка задания на выполнение анализа данных в фоновом режиме.

Установка FastAPI

$ pip install fastapi uvicorn

Здесь мы устанавливаем FastAPI и uvicorn, которые будут использоваться для запуска сервера FastAPI.

Фоновые задачи

Становится очень необходимым запускать длительные процессы или задачи в ваших API. Эти задачи могут быть такими же простыми, как отправка пользователям уведомлений по электронной почте. Для выполнения таких фоновых задач может потребоваться время, и, как указано в любой передовой практике,

API, которому требуется более 5 секунд для возврата действительного ответа, не является хорошим API.

FastAPI обеспечивает лучший контроль при работе с фоновыми процессами. Здесь я возьму приведенный ниже пример, чтобы продемонстрировать, насколько эффективно обрабатываются фоновые задачи при построении с помощью FastAPI.

В качестве примера я создам API, который отправляет электронное письмо конечному пользователю и создает подтверждение в настраиваемом файле, и все это в рамках одного API.

Позволяет имитировать отправку электронного письма с помощью функции FastAPI BackgroundTask.

Сначала импортируйте BackgroundTasks и определите параметр в своей функции работы с путями с объявлением типа:

Создать функцию задачи

Создайте функцию, которая будет запускаться в качестве фоновой задачи. Это стандартная функция, которая может получать параметры. Это может быть async def или обычная функция def, FastAPI знает, как с этим правильно обращаться. В этом случае функция задачи будет записывать в файл (имитируя отправку электронного письма).

И поскольку операция записи не использует async и await, мы определяем функцию с помощью normal def:

Регистрация задачи

Теперь внутри функции send_notification вы можете передать функцию задачи объекту BackgroundTask с помощью метода add_task () .

add_task () получает в качестве аргументов:

  • Функция задачи, выполняемая в фоновом режиме (write_notification).
  • Любая последовательность аргументов, которая должна быть передана в функцию задачи по порядку (электронная почта).
  • Любые аргументы ключевого слова, которые должны быть переданы функции задачи (сообщение = «какое-то уведомление»).

Запуск приложения

Мы будем использовать uvicorn для запуска сервера FastAPI. Выполните следующую команду:

uvicorn main.py:app --reload

Ответ возвращается в течение 6 мс, что было бы невозможно без асинхронности наших API. Что ж, может быть, поскольку это всего лишь симуляция - это могут быть ложные данные. Итак, давайте попробуем добавить 10 секунд сна в функцию write_notification -

Как показано в приведенном выше коде, раскомментируйте строку time.sleep (10) и снова вызовите API. Это все равно займет время в миллисекундах, и по прошествии 10 секунд в каталоге проекта будет создан файл log.txt, содержащий электронное письмо, которое вы отправляете в API в качестве параметра.

Https://github.com/varun-singh-01/fastapi-background-tasks/tree/master

Заключение

BackgroundTasks - это собственный способ FastAPI для обработки асинхронных задач, которые будут выполняться в фоновом режиме. Можно легко поддерживать сценарий всех таких задач и запускать их по мере необходимости, зарегистрировав их с помощью объекта BackgroundTasks в их API.

Подробнее об авторе

Я штатный инженер-программист с более чем 3,5-летним опытом работы в Python, AWS и многих других технологиях. Я начал писать недавно, так как это помогает мне читать больше. Я с нетерпением жду возможности поделиться техническими знаниями и своим жизненным опытом с людьми.

  • Подпишитесь на меня в LinkedIn, чтобы увидеть больше статей и обновлений - Варун
  • Подписывайтесь на меня на Medium - Варун

Больше контента на plainenglish.io