Веб по-асинхронному Обзор асинхронных фреймворков для Python

Асинхронный фреймворк - это ключ к тому, чтобы твое крутое веб-приложение могло обрабатывать сразу тысячи одновременно висящих клиентов даже на средненьком дедике. Звучит фантастично? Поверь мне, это правда!

Что за зверь?

Прежде чем окунуться в омут фреймворков, я хочу поведать о том, что же на самом деле такое «асинхронность». Современные методы программирования в большинстве своем базируются на так называемом синхронном стиле (выполнении кода построчно, шаг за шагом, линейно). Для более ясного понимания представим веб-сервер, который получает запрос от клиента, и пока сервер обрабатывает один запрос, другие клиенты должны будут ждать конца выполнения, и только после этого до них дойдет очередь. Согласись, это далеко не самый эффективный способ. Если ты в теме, то можешь возразить мне и сказать, что человечество давно уже придумало потоки. Но в потоках скрывается куда больше проблем, чем они способны решить. Представь себе 10 тысяч одновременных соединений, и следовательно, 10 тысяч потоков. Создание огромного количества потоков просто- напросто поглотит всю оперативную память компьютера, не говоря уже о быстродействии процессора между переключением контекста — налицо явная DOS-атака. Наиболее эффективное решение обработки тысячи одновременных соединений — это, несомненно, асинхронные сокеты. Асинхронный стиль, он же  данных не ждет ответа, а сразу передает управление дальше, поэтому, как только сервер соизволит ответить, мы об этом узнаем и как следует обработаем его ответ. То есть, концепция асинхронного программирования заключается в том, что ты пишешь код, который реагирует на определенные события — например, когда клиент подключен/отключен/готов к приему сообщений и так далее. Неблокирующий сетевой ввод-вывод в разных операционных системах реализуется по-разному. Например, в Windows это seLectd. в Linux, а во FreeBSD это kqueuel. Помнится мне, что в одном из старых выпусков журнала, многоуважаемый Михаил Флёнов, он же horiffic, рассказывал о том, как написать самый быстрый в мире сканер портов. Очень советую отыскать тебе эту статью и как следует понять описанные в ней механизмы [хакер. ru/magazine/xa/042/058/1 .asp — как же давно это было... — прим. ред.]. Именно эти механизмы позволяют нам обрабатывать тысячи одновременно открытых сокетов в рамках одного процесса, а, следовательно, и одного главного потока. Но стоит отметить, что такой подход скрывает в себе и подводные камни, о которых я расскажу в конце статьи. А сейчас приступим непосредственно к обзору инструментария.

Зверинец фреймворков

Куда же без их, родимых? Для Python-программистов на интернет- рынке существует огромное количество интересных фреймворков — как асинхронных, так и синхронных. Из последних, пожалуй, стоит выделить всеми известный и попсовый фреймворк Django, о котором ][ писал не так давно. Но сегодня речь не о нем (точнее, не только о нем]. Итак, что же у нас есть на сегодняшний день? Стоит отметить, что у данного фреймворка весьма интересная история. Изначально он писался для внутреннего использования сервисом FriendFeed. Позже, когда сервис был выкуплен в 2009 году социальной сетью Facebook, ребята решили выложить исходные тексты этого замечательного инструмента.

Tornado

На текущий момент Tornado имеет небольшое, но дружное сообщество разработчиков и пользователей, которые активно обсуждают и поддерживают любимый фреймворк. Доказательством моих слов служит недавний стабильный релиз второй версии Tornado. Пожалуй, одним из значительных минусов этого неблокирующего аппарата является отсутствие внятной документации, отсюда и не столь его большая популярность по сравнению с Django, где документация просто сказочная. Но для настоящего питониста это не должно быть преградой, ибо мы не ищем легких путей! Тем более, что читать исходный код Tornado очень приятно —он красиво и корректно написан. А совмещать приятное с полезным вдвойне приятно, тем более, что кода совсем немного. Кстати, если ты работал с микрофреймворком web.ру, то Tornado покажется очень знакомым, в нем сочетаются те же самые простота и эффективность: — за примерами можно обратиться к папке demos в архиве фреймворка, благо, их там достаточно. Так что же у него внутри? Чем он так привлекает немалое количество профессионалов среди веб-разработчиков? Tornado по праву можно назвать полноценным веб-инструментом. В нем отлично поддерживается парадигма MVC (model-view-controller], обращает на себя внимание весьма серьезный по скорости встроенный шаблонизатор с хорошим синтаксисом шаблонов, похожим на синтаксис шаблонов Django. Приятным плюсом для меня был и набор модулей для авторизации на популярных социальных сервисах типа Twitter, Facebook, Google — сейчас очень модно лепить такие фишки на сайтах, дабы не посылать юзера через дебри этапов регистрации. Благо нынче у каждого компьютеризированного человека есть хотя бы один аккаунт в этих сетях. Относительно работы с базой данных разработчики проявили некоторый агностицизм и по умолчанию поддерживают работу только с MySQL, которая всецело построена в блокирующем стиле, поэтому практически все плюшки асинхронной работы Tornado исчезают, если ты пишешь веб- приложение, которое взаимодействует с MySQL-базой, хотя попытки написания стабильного асинхронного драйвера продолжаются. Из этой ситуации есть выход — использовать PostgreSQL, который явно быстрее MySQL и в последних релизах поддерживает асинхронную обработку запросов.

База интересных сниппетов от сообщества Tornado

Простейший Hello world в Tornado выглядит так:

Hello world на Tornado import tornado.ioloop import tornado.web class MainHandler(tornado.web.RequestHandler): def get (self): self.write("Hello, world") application = tornado.web.Application^ (r"/", MainHandler), ]) if name == " main ": application.listen(8888) tornado.ioloop.IOLoop.instance().start()  

Запускать данный скрипт можно прямо в консоли —Tornado действительно многое унаследовал от web.ру в плане простоты. Вето поставку входит весьма неплохой http-сервер, который лучше всего запускать за front-end-cepeepoM вроде nginx, для более стабильной и эффективной работы твоего веб-приложения. Для более детального ознакомления с его спецификациями советую сходить на официальный сайт фреймворка. Плюсы:

  1. Достаточно низкий порог входа, что дает значительное преимущество перед остальными фреймворками.
  2. Весьма легкий для чтения и понимания код, нет практически ничего лишнего.
  3. Внушительно быстрая обработка тысяч одновременно открытых соединений. За конкретными тестами милости прошу в линки, указанные мной во врезке.
  4. элитные люстры Очень заманчивое предложение: Анавита - широкий выбор!

Минусы:

  1. Отсутствие внятной документации.
  2. Tornado беден на сторонние библиотеки, хотя это вопрос времени.
Twisted

Пожалуй, Twisted по праву можно назвать «швейцарским ножом» для любого сетевого программиста на Python. Это настолько огромный монстр с внушительным функционалом, что о большем и мечтать нельзя. Он поддерживает работу с целым зоопарком протоколов: TCP/UDP, SSLV TLS, HTTP, SSH, FTP, IRC, NNTP, XMPP и еще кучей всего остального. Из плюсов Twisted стоит выделить весьма богатую библиотеку, а также внятную и обширную документацию с практическими примерами. Чисто с моей точки зрения, Twisted — это целая платформа, изучение которой требует немало времени и практики, но оно того стоит, если ты так или иначе вовлечен в удивительный мир сетевого кодинга. Кстати, о Twisted написана не одна книга, что лишний раз подтверждает серьезность фреймворка. Обратной стороной медали является тот факт, что любая большая система чаще всего является сложной. Увы, Twisted — не исключение. Помимо сложности изучения, Twisted значительно уступает по скорости обработки соединений вышеупомянутому Tornado.

0 многочисленных тестах, которые проводились между различными неблокирующими фреймворками Питон,ты можешь узнать из линков в конце статьи. Также стоит отметить, что разрабатывать веб-приложение на Twisted, как в плане написания, так и в плане развертывания, на порядок сложнее, чем в Tornado. Twisted нетак просто (по сравнению с Tornado или тем же Django) интегрировать с базой данных — в его конкурентах львиную долю работы на себя берет фреймворк —даже в части создания таблиц и формирования SQL-запросов.

Плюсы:

  1. Очень богатая библиотека
  2. Отличная документация.

Минусы:

  1. Судя по тестам,является далеко не лидером в быстродействии.
  2. Достаточно высокий порог вхождения.
Похожие статьи Меню Опрос Фото Популярное