Асинхронное программирование теперь является первоклассным гражданином в Python. Если вы веб-разработчик, вы можете выбрать изумительные фреймворки!


На момент написания статьи асинхронный больше не был просто модным словом в сообществе Python. С выпуском его asyncio библиотека в версии 3.5, Python признала влияние Node.js на веб-разработку и ввела в язык два новых ключевых слова – async и await. Это было очень большое дело, потому что язык Python крайне осторожен в расширении основного синтаксиса, если в этом нет острой необходимости, которая только указывает на то, насколько фундаментально важно, чтобы разработчики Python рассматривали асинхронные возможности.

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

Но достаточно мотивации!

Давайте рассмотрим текущий ландшафт Python и рассмотрим некоторые из лучших асинхронных сред.

Торнадо

Как ни странно, Торнадо это не новая структура вообще. Его первый выпуск был в 2009 году (ровно десять лет назад, на момент написания статьи), и с тех пор его внимание было сосредоточено на обеспечении надежного асинхронного программирования с высоким уровнем параллелизма.

Торнадо не является веб-структурой в принципе. Это коллекция асинхронных модулей, которые также используются для создания модуля веб-фреймворка. Более конкретно, эти модули:

  • Сопрограммы и другие примитивы (tornado.gen, tornado.locks, tornado.queues и т. Д.)
  • Сетевые модули (торнадо.ioloop, торнадо.iostream и т. Д.)
  • Асинхронные серверы и клиенты (tornado.httpserver, tornado.httpclient и т. Д.)

Они были объединены для создания окончательных базовых модулей: tornado.web, tornado.routing, tornado.template и т. Д..

импорт торнадо.ioloop
импорт tornado.web

Класс MainHandler (tornado.web.RequestHandler):
def get (self):
self.write ("Привет мир")

def make_app ():
возврат tornado.web.Application ([
(р"/", MainHandler),
])

если __name__ == "__главный__":
app = make_app ()
app.listen (8888)
tornado.ioloop.IOLoop.current (). начать ()

Tornado имеет сильных и преданных последователей в сообществе Python и используется опытными архитекторами для создания высокопроизводительных систем. Это фреймворк, который долгое время отвечал на проблемы параллелизма, но, возможно, не стал мейнстримом, поскольку не поддерживает стандарт WSGI и был слишком активным участником (помните, что большинство библиотек Python по-прежнему синхронны ).

Sanic

Sanic это «современный» фреймворк в истинном смысле этого слова: он не поддерживает версию Python ниже 3.6, поддерживает простой и универсальный синтаксис async / await «из коробки» и, как следствие, не заставляет вас читать нагрузки документации и помните крайние случаи, прежде чем вы сможете написать свой первый обработчик HTTP.

В результате результирующий синтаксис довольно приятен (на мой взгляд, по крайней мере); он напоминает код, который вы пишете с помощью любой другой микросхемы (например, Flask, CherryPy) с несколькими асинхронными операциями:

от sanic импорт Sanic
от sanic.response импорт json

app = Sanic ()

@ App.route ("/")
async def test (запрос):
вернуть JSON ({"Привет": "Мир"})

если __name__ == "__главный__":
app.run (хост ="0.0.0.0", порт = 8000)

Sanic, пожалуй, самая популярная и самая любимая асинхронная среда в мире Python. Он имеет почти все функции, которые вы хотели бы для своих проектов – маршрутизация, промежуточное ПО, файлы cookie, управление версиями, чертежи, представления на основе классов, статические файлы, потоковая передача, сокеты и т. Д. – и то, что он не предлагает “из коробки” – шаблоны, поддержка базы данных, файловый ввод / вывод, очереди – могут быть добавлены, так как на сегодняшний день для них достаточно асинхронных библиотек.

Vibora

Vibora является близким родственником Sanic, за исключением того, что он намерен стать самым быстрым веб-сервером Python. Фактически, самое первое посещение его сайта встречает вас сравнением фреймворка:

Как видите, Vibora утверждает, что она в несколько раз быстрее классических фреймворков и в два раза быстрее, чем Sanic, ее ближайший конкурент. Конечно, критерии должны быть взяты с крошкой соли. ��

Хотя по синтаксису и функциям Vibora сравним с Sanic (или, может быть, даже немного лучше, поскольку он объединяет популярные библиотеки и такие вещи, как шаблоны, доступны из коробки), я бы посчитал Sanic более зрелым, поскольку он существует дольше и имеет большее сообщество.

от вибора импорт Vibora, JsonResponse

app = Vibora ()

@ App.route ( ‘/’)
async def home ():
вернуть JsonResponse ({‘привет’: ‘мир’})

если __name__ == ‘__main__’:
app.run (хост ="0.0.0.0", порт = 8000)

Однако, если вы любитель выступлений, Vibora может поднять вашу лодку. Тем не менее, на момент написания Vibora подвергается полной переписке, чтобы стать еще быстрее, и ссылка на сайт к его версии производительности говорит, что это находится в «тяжелой разработке». Это будет разочарование для тех, кто приобрел Vibora раньше и скоро столкнется с серьезными изменениями, но эй, это первые дни в асинхронном мире Python, и никто не ожидает, что все будет стабильно.

кварта

Если вам нравится разрабатывать во Flask, но вы сожалеете об отсутствии асинхронной поддержки, вам понравится кварта много.

Quart соответствует требованиям ASGI стандарт, который является преемником известного стандарта WSGI и предлагает асинхронную поддержку. Что интересно в Quart, так это то, что он не только похож на Flask, но и фактически совместим с Flask API! Автор этого фреймворка хотел сохранить чувство Flask и просто добавить к нему поддержку асинхронности, WebSockets и HTTP 2. В результате вы можете узнать Quart прямо из документации Flask, просто помня, что функции в Quart асинхронны.

из кварта импорт Quart

app = Quart (__name__)

@ App.route ( ‘/’)
async def hello ():
вернуть “привет”

app.run ()

Чувствуется (почти) как Flask, не так ли?!

Поскольку Quart является развитием Flask, доступны все функции Flask: маршрутизация, промежуточное программное обеспечение, сеансы, шаблоны, чертежи и т. Д. На самом деле, вы даже можете использовать расширения Flask непосредственно внутри Quart. Один из уловок заключается в том, что Python 3.7+ поддерживается только, но тогда, если вы не используете последнюю версию Python, возможно, асинхронный не правильный путь. ��

Документация действительно нужна, если у вас нет более раннего опыта работы с Flask, но я могу порекомендовать Quart, так как это, вероятно, единственная асинхронная среда, скоро приближающаяся к своей версии 1.0.

FastAPI

Последняя (но самая впечатляющая) структура в этом списке FastAPI. Нет, это не только API-интерфейс; на самом деле FastAPI, кажется, является самой многофункциональной и богатой документацией средой, с которой я сталкивался при исследовании асинхронных сред Python.

Интересно отметить, что автор фреймворка подробно изучил несколько других фреймворков, от современных, таких как Django, до современных, таких как Sanic, а также рассматривая технологии в NestJS (веб-фреймворк Nodes.js, Typescript). Их философия развития и обширные сравнения можно прочитать Вот.

Синтаксис довольно приятный; Можно даже утверждать, что это гораздо приятнее, чем другие структуры, с которыми мы сталкивались:

rom fastapi импорт FastAPI

app = FastAPI ()

@ App.get ("/ пользователей / меня")
async def read_user_me ():
возвращение {"ID пользователя": "текущий пользователь"}

@ App.get ("/ пользователи / {идентификатор_пользователь}")
async def read_user (user_id: str):
возвращение {"ID пользователя": ID пользователя}

А теперь список убойных функций, которые делают FastAPI затмевающими другие платформы:

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

Фреймворк также выполняет автоматическую документацию по модели данных с помощью JSON Schema..

Современное развитиеДа, слово «модерн» часто встречается, но я нашел FastAPI на самом деле. Инъекция зависимостей и подсказки типов – это первоклассные граждане, которые внедряют не только хорошие принципы кодирования, но и предотвращают ошибки и путаницу в долгосрочной перспективе..

Обширная документация: Я не знаю, как вы, но я очень люблю хорошую документацию. И в этой области FastAPI выигрывает в рукопашной. У него есть страницы на страницах документов, объясняющих почти каждую мелочь и «остерегайтесь!» моменты для разработчиков всех уровней. Я чувствую ясное «сердце и душу» в документах здесь, и единственное сравнение, которое я могу найти, это документы Django (да, документы FastAPI – это хорошо!).

Помимо основ: FastAPI поддерживает WebSockets, Streaming, а также GraphQL, помимо традиционных помощников, таких как CORS, сеансы, файлы cookie и т. Д..

А как насчет производительности? Итак, FastAPI построен на потрясающей библиотеке Starlette, что обеспечивает производительность, соответствующую Node, а в некоторых случаях даже Go! В общем, у меня действительно есть ощущение, что FastAPI будет впереди как главная асинхронная среда для Python.

Вывод

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

Но все сказано и сделано; Python готов к производству, чтобы обеспечить невероятную производительность, когда дело доходит до веб-фреймворков. Если вы так долго думали о переходе на Node, то вам не нужно! ��

Звучит круто? Мастер Python сегодня!

TAGS:

  • питон

Jeffrey Wilson Administrator
Sorry! The Author has not filled his profile.
follow me