Flask против FastAPI

Мы живем в мире после Python 2, поскольку большинство компаний адаптировалось к Python 3. Язык становится более зрелым. В последнее время Python перенимает интересные вещи из других языков. Несколько примеров - это подсказки типа и синтаксис async/await.

Из-за этих изменений в языке Python пришло время обсудить нового зверя в городе: FastAPI. Давайте рассмотрим три преимущества выбора FastAPI перед Flask, основываясь на моем многомесячном опыте использования обоих.

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

Асинхронный

Синтаксис async/await - это то, что недавно было введено в Python. Большинство программистов думают, что это все ускорит. Это не совсем так, поскольку синхронный код подходит для большинства сценариев. Async/await - это очень удобный способ написания асинхронного кода.

С точки зрения программирования API это очень интересно. Мы видим растущую потребность в асинхронных задачах, таких как организация очередей, WebSockets и т. Д. В отличие от Flask, FastAPI реализован на ASGI и позволяет создавать как асинхронные, так и синхронные приложения изначально.

Представьте, что вы пишете конечную точку, которая получает изображения животных. Каждый запрос может занять некоторое время. В фоновом режиме вы можете делать некоторые прогнозы на основе текста и HTTP-вызовов изображений. Большую часть времени ваш поток ожидает завершения некоторой операции.

В синхронном мире в следующем фрагменте сначала будет изображение кошки, затем изображение собаки и, наконец, изображение летучей мыши. Один за другим. Просто и легко - программирование, как мы его давно знаем.

get('A picture of a cat') // first
get('A picture of a dog') // second
get('A picture of a bat') // third

Однако представьте, что этот API открыт всему миру и пользователи его используют. Представьте, что обработка каждого запущенного запроса занимает 300 миллисекунд. Когда 50 запросов отправляются одновременно в синхронном мире, последний запрос будет завершен через 15 секунд.

Внезапно ваш API стал медленным. Вы можете масштабировать его, используя несколько потоков и прочее, но не намного. В конце концов, это довольно быстро усложняется. По сути, каждый поток, выполняющий эту задачу, тратит 300 миллисекунд в ожидании ничего.

Асинхронное программирование предлагает улучшения. Asyncio позволяет дождаться завершения процесса и одновременно выполнять другие вычисления с тем же потоком. Больше не нужно ждать! 50 запросов? Без проблем. Мы рассылаем их всех, одного за другим. Вы можете видеть это как один поток, который имеет несколько стеков вызовов.

Пока базовая инфраструктура может справиться с этим, мы в порядке. В этом крайнем случае мы даже можем сократить время ожидания до немногим более 300 миллисекунд для всех запросов. Ты понял? Если нет, посмотрите этот учебник.

Большое предупреждение: если вы не можете обработать большое количество запросов, убедитесь, что вы ставите в очередь входящие запросы со скоростью, которую вы можете обработать. Можно написать настолько быстрый код, что он уничтожит весь кластер Kubernetes. Во время недавней сетевой конференции по машинному обучению Кармин Паолино упомянул, что вы должны помнить об этом, когда переводите свое приложение в рабочую среду. Убедитесь, что вы можете обрабатывать множество одновременных запросов, отправляемых одновременно.

Типовые подсказки

FastAPI основан на подсказках типов. До этого момента Flask их просто игнорировал. Подсказки типа дают нам большую читаемость. В любой момент времени мы точно знаем, с каким типом работаем. Это очень ценно. Хотя это обычная практика для других языков, таких как Java и TypeScript, это новое и приятное дополнение к языку Python.

Индустрия адаптируется. Как никогда ранее, Python используется не только как язык для быстрого написания сценариев. Все больше и больше команд работают вместе, записные книжки делятся друг с другом, пишется больше тестов, чем когда-либо прежде. В настоящее время даже интерфейсный мир пишет тесты (не обижайтесь, если вы принадлежите к нему). Развитие рассматривается как ремесло, и так должно быть.

Большая часть написанного сегодня кода еще не соответствует стандартам, которых хотели бы настоящие мастера. Подсказки типа дают нам еще один инструмент, который поможет нам двигаться в правильном направлении. В сочетании с правильным именованием переменных это избавляет нас от многих проблем. Молодец, Python.

Встроенный OpenAPI

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

FastAPI имеет встроенные OpenAPI (Swagger) и Redoc. Это хорошее дополнение, которое FastAPI предлагает вместо Starlette, на котором он основан. Flask также не имеет встроенного OpenAPI, поэтому вам понадобится дополнительная библиотека для выполнения тех же задач.

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

Заключение

В этой статье мы обсудили три важные причины выбрать FastAPI вместо Flask:

  1. Асинхронное программирование
  2. Подсказки по типу
  3. Встроенная документация

Как программист, я всегда думаю, что ваш фреймворк работает ровно настолько, насколько быстро вы пишете код. Вот почему скорость - то, что FastAPI довольно хорошо продает на своем веб-сайте - в этой статье не обсуждается. То же самое касается ошибок, скорости кодирования и т. Д. Для меня эти показатели трудно измерить. Вы можете легко сравнить яблоки с апельсинами.

Если честно, вы можете писать невероятно быстрые приложения как во Flask, так и в FastAPI. Если вы можете улучшить свое приложение с помощью асинхронного программирования, почему бы и нет?