Когда использовать Tornado, когда использовать Twisted/Cyclone/GEvent/other

Какая из этих фреймворков/библиотек будет лучшим выбором для создания современного многопользовательского веб-приложения? Я хотел бы иметь асинхронный веб-сервер, который позволит мне масштабироваться легко. Какое решение предоставит лучшую производительность/ масштабируемость/ наиболее полезную фреймворк (с точки зрения простоты использования и простоты разработки)?

Было бы здорово, если он обеспечит хорошие функциональные возможности (веб-сайты, rpc, потоковое и т.д.).

Каковы преимущества и недостатки каждого решения?

Ответ 1

" Django - это высокоуровневая среда Python Web, которая поощряет быстрое развитие и чистый, прагматичный дизайн". Если вы строите что-то похожее на сайт электронной коммерции, то вам, вероятно, стоит пойти с Django. Это ускорит вашу работу. Вам не нужно беспокоиться о слишком многих технологиях. Он обеспечивает все, что вам нужно, от механизма шаблонов до ORM. Будет немного уместен о том, как вы структурируете свое приложение, и это хорошо. Если вы спросите меня. И у этого есть самое сильное сообщество всех других библиотек, что означает, что доступна легкая помощь.

" Flask - это микрокарандаш для Python на основе Werkzeug, Jinja 2 и добрые намерения". Остерегайтесь - "микрокарт" может вводить в заблуждение. Это не означает, что Flask представляет собой библиотеку с половинной выпечкой. Это означает, что ядро ​​колбы очень, очень просто. В отличие от Django, он не будет принимать никаких технологических решений для вас. Вы можете выбрать любой движок шаблонов или ORM, который понравится вам. Несмотря на то, что он поставляется с движком Jinja по умолчанию, вы всегда можете выбрать наш собственный. Насколько мне известно, Flask пригодится для написания конечных точек API (службы RESTful).

" Twisted - это механизм, управляемый событиями, написанный на python". Это высокопроизводительный движок. Основной причиной его скорости является то, что называется отсрочкой. Twisted построен поверх отложенных. Для тех из вас, кто не знает о прилежании, достигается механизм с асинхронной архитектурой. Скрученный очень быстро. Но не подходит для написания обычных webapps. Если вы хотите сделать что-то низкоуровневое сетевое оборудование, твист - ваш друг.

" Tornado - это веб-инфраструктура Python и асинхронная сетевая библиотека, первоначально разработанная в FriendFeed. неблокирующий сетевой ввод-вывод, Tornado может масштабироваться до десятков тысяч открытых подключений, что делает его идеальным для длительного опроса, WebSockets и других приложений, для которых требуется долговременное подключение к каждому пользователю". Торнадо стоит где-то между Django и Flask. Если вы хотите написать что-то с Django или Flask, но если вам нужна более высокая производительность, вы можете выбрать Tornado. он может справиться с проблемой C10k очень хорошо, если он архивирован правильно.

" Cyclone - это структура веб-сервера для Python, которая реализует API Tornado в качестве витой протокол", Теперь, что, если вы хотите что-то, что почти так же сильно, как Twisted, но легко писать обычные webapps? Поздороваться с циклоном. Я бы предпочел Циклон над Торнадо. У этого есть API, который очень похож на Tornado. На самом деле это вилка Торнадо. Но проблема в том, что она имеет относительно малое сообщество. Alexandre Fiori является единственным основным участником репо.

" Pyramid - это общая открытая среда разработки приложений для веб-приложений Python. чтобы разработчик Python упростил создание веб-приложений". Я действительно не использовал Пирамиду, но я просмотрел документацию. Из того, что я понимаю, Pyramid очень похож на Flask, и я думаю, что вы можете использовать Pyramid везде, где Flask кажется подходящим, и наоборот.

РЕДАКТИРОВАТЬ: запрос на рассмотрение любых других фреймворков приветствуется!

Источник: http://dhilipsiva.com/2013/05/19/python-libraries-django-twisted-tornado-flask-cyclone-and-pyramid.html

Ответ 2

Это явно несколько предвзятый ответ, но это не то же самое, что неправильный ответ; вы всегда должны использовать Twisted. Я уже ответил на подобные вопросы, но поскольку ваш вопрос не совсем то же самое, вот несколько причин:

"Лучшая производительность"

Скрученный непрерывно контролирует нашу производительность на веб-сайте speed.twistedmatrix.com. Мы также были одним из первых проектов которые будут контролироваться PyPy аналогичным сайтом, тем самым гарантируя хорошую производительность Twisted во время выполнения, высокопроизводительные приложения на Python.

"Масштабируемость"

Насколько мне известно, ни одна из перечисленных фреймворков не имеет встроенной поддержки автоматического масштабирования; все они являются средами связи, поэтому вам нужно выполнить работу для связи между вашими узлами масштабирования. Однако у Twisted есть преимущество в встроенной поддержке локальной многопроцессорной обработки. Справедливости ради, есть стороннее дополнение для Tornado, которое позволяет вам делать то же самое. В последних выпусках В Twisted добавлены функции, которые увеличивают количество способов совместной работы между ядрами, а работа продолжается в этой области. У Twisted также есть пара хорошо интегрированный, "native" Протоколы RPC, которые предлагают конструкционный набор для любой именованной идиомы, которую вы хотите продолжить.

"Самый полезный"

Множество людей, кажется, нашли Twisted очень полезно. Настолько, что многие из них расширили его и сделали доступными ваши расширения.

"Функциональность"

Из коробки, Twisted включает в себя:

В этом последнем отделе, по крайней мере, Twisted кажется явным победителем встроенных функций. И все это, в пакете чуть более 2 мегабайт!

Ответ 3

Мне нравится @Glyph response. Twisted - очень полная, богатая инфраструктура python. Twisted and Tornado имеют очень похожий дизайн. И мне очень нравится этот дизайн:

  • быстро
  • легко понять
  • легко расширяется
  • не требует c-расширений
  • работает над PyPy.

Но я хочу выделить "Торнадо", который я предпочитаю, и в последнее время получаю популярность. Tornado, как и Twisted, использует программирование стиля обратного вызова, но его можно вставить с помощью tornado.gen.engine (twisted.internet.inlineCallbacks в Twisted).

Codebase

Лучший комментарий с сайта http://cyclone.io. циклон пытается смешивать Twisted и Tornado, потому что:

Twisted является одной из самых зрелых библиотек для неблокирующего ввода-вывода, доступных для общественности. Tornado - это версия веб-сервера FriendFeeds с открытым исходным кодом, один из самых популярных и быстрых веб-серверов для Python, с очень достойный API для создания веб-приложений.

Идея состоит в том, чтобы сфокусировать элегантный и простой API Tornado на Twisted Event-Loop, позволяющая использовать огромное количество поддерживаемых протоколов.

Но в 2011 году tornado.platform.twisted вышел, что приносит аналогичную функциональность.

Производительность

У Tornado намного лучше производительность. Он также прекрасно работает с PyPy и получает огромный выигрыш.

Масштабируемость

То же, что и Twisted. Tornado имеет tornado.process и множество rpc-сервисов, реализованных поверх него.

Функциональность

Есть 71 пакет, основанный на Tornado, по сравнению с 148 Twisted и 48 Gevent's. Но если вы внимательно посмотрите и вычислите медианное время загрузки пакетов, вы увидите, что Twisted являются самыми старыми, а затем Gevent и Tornado самыми свежими. Кроме того, существует модуль tornado.platform.twisted, который позволяет запускать код, написанный для Twisted on Tornado.

Резюме

С помощью Tornado вы можете использовать код от Twisted. Нет необходимости использовать циклон, который только закручивает ваш код (ваш код становится более грязным).

Что касается 2014 года, то Tornado считается широко принятой и по умолчанию асинхронной картой, которая работает как на python2, так и на python3. Кроме того, последняя версия 4.x обеспечивает большую функциональность от https://docs.python.org/dev/library/asyncio.html.

Я написал статью, объясняя, почему я считаю, что Tornado - лучшая веб-инфраструктура Python, где я написал гораздо больше о функциях Tornado.

Ответ 4

( ОБНОВЛЕНИЕ. Я с грустью удивляюсь, как немногие ответы здесь рекомендуют или даже упоминают Gevent-я не думаю, что это пропорционально популярности, производительности и простоте использования этой превосходной библиотеки!)

Gevent и Twisted не являются взаимоисключающими, хотя наоборот может показаться очевидным вначале. Существует проект под названием geventreactor, который позволяет относительно плавно использовать лучшее из обоих миров, а именно:

  • Эффективная и дешевая (кооперативная зеленая) модель потока Gevent, которая намного проще программировать, когда дело доходит до concurrency -frankly, Twisted inlineCallbacks просто не соответствует заданию с точки зрения производительности, когда он приходит ко многим сопрограммам, и ни с точки зрения удобства/прозрачности использования: yield и Deferreds везде; часто трудно построить некоторые абстракции; ужасающе бесполезные трассировки стека с голой Deferred, а также, и тем более с @inlineCallbacks.
  • Все встроенные функции Twisted, о которых вы когда-либо могли мечтать, включая, но не ограничиваясь, IReactorProcess.spawnProcess.

Я лично в настоящее время использую Gevent 1.0rc2 с Twisted 12.3, смонтированным geventreactor. Я внедрил свои собственные пока еще неопубликованные дополнения и улучшения к geventreactor, которые я скоро опубликую, надеюсь, как часть оригинального репозитория GitHub geventreactor: https://github.com/jyio/geventreactor.

Мой текущий макет позволяет мне программировать в хорошей модели программирования Gevent и использовать такие вещи, как неблокирующий socket, urllib2 и другие модули. Я могу использовать обычный код Python для выполнения обычных вещей, в отличие от кривой обучения и неудобства делать простые простые вещи Twisted way. Я также могу легко использовать большинство сторонних библиотек, которые обычно либо не могут быть рассмотрены с помощью Twisted, либо требуют использования потоков.

Я также могу полностью избежать неудобного и часто чрезмерно сложного программирования на основе обратного вызова с использованием зеленых (вместо Deferred и обратных вызовов и/или @inlineCallbacks).

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