Когда использовать Торнадо, когда использовать Twisted / Cyclone / GEvent / прочее [закрыто]

181

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

Было бы здорово, если бы он обеспечивал хорошую функциональность (websockets, rpc, потоковая передача и т. Д.).

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

Войцех Данило
источник
Это должна быть одна из этих структур? Что ты планируешь делать и может ли что-то вроде Django, Pylons и т. Д. Работать?
Джо Доэрти
Нет, конечно нет, но я бы хотел, чтобы он был асинхронным и имел бы хорошую поддержку веб-сокетов - я также обновил вопрос. Спасибо.
Войцех Данило
3
Вроде широкий вопрос, не так ли?
Жан-Поль Кальдероне
Ваш выбор зависит от библиотек, которые вы хотите использовать. Ваши библиотеки - на задачу, которую вы хотите решить.
Николай Фоминых
1
Да, это широко, но возможно. Мне интересно, используются ли эти библиотеки в производстве, и кто-то, кто использует некоторые из них каждый день, может сказать, для чего они хороши, чего им не хватает и т. Д. Каким должно быть основание для выбора библиотеки - возможно, Twisted должен быть осуждается, когда речь идет об автобане или циклоне? Или mmaybe Autobahn и Cyclone не готовы к производству, и их обслуживание находится под вопросом? Или, может быть, Tornado имеет более современный дизайн, и его будущее, вероятно, будет блестящим и великолепным, и это должен быть выбор для стартапа?
Войцех Данило

Ответы:

226

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

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

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

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

« Cyclone - это платформа веб-сервера для Python, которая реализует API Tornado в виде витого протокола» . А что если вам нужно что-то такое же производительное, как Twisted, но которое легко написать обычными веб-приложениями? Скажи привет циклону. Я бы предпочел Циклон, а не Торнадо. У него есть API, очень похожий на Tornado. На самом деле, это вилка Торнадо. Но проблема в том, что у него относительно небольшое сообщество. Александр Фиори - единственный главный участник репо.

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

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

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

dhilipsiva
источник
1
Джанго - моя любимая структура. Его документация очень хорошая, а ORM проста. South отлично подходит для миграции схем баз данных ... Но вопрос содержал следующее: «Я хотел бы иметь асинхронный веб-сервер, который позволит мне легко масштабировать». Django был создан для классических сайтов с запросами и ответами, а не для асинхронных.
Геттли
1
Ты можешь написать о Пирамиде?
Fizer Khan
5
@FizerKhan: По вашему запросу я обновил ответ. Извините, что так долго. Не было времени, чтобы использовать пирамиду. Но я просмотрел документацию.
дхилипсива
1
Я бы добавил, что однопоточная среда, которую использует Tornado, намного более подвержена ошибкам - ошибка, которая делает код для одной конечной точки API медленнее, легко вызовет проблемы для всех конечных точек.
Абель Молина
1
Не могли бы вы прокомментировать вишневый?
Ставрос Аврамидис
60

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

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

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

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

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

"Наиболее полезный"

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

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

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

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

глиф
источник
6
почему так много людей говорят, что они больше не используют Twisted, а GEvent?
remdezx
1
Многие люди говорят, что сложно поддерживать большие приложения, использующие Twisted (из-за его архитектуры обратного вызова): stackoverflow.com/questions/3048012/… Не лучше ли использовать Twisted на основе gevent или gevent?
Войцех Данило
8
@remdezx На ваш вопрос есть две причины. Во-первых, людям трудно понять Twisted, потому что параллельное программирование трудно понять. Затем они переключаются на GEvent, потому что это легко понять - до тех пор, пока нет параллелизма, все работает так, как вы ожидаете. Другая причина заключается в том, что гораздо труднее перенести код на GEvent, который не был написан с использованием API, управляемого событиями, чтобы получить преимущества в производительности от ввода-вывода, управляемого событиями. Если ваш код не разделяет слишком много состояния, такой порт, вероятно, работает нормально.
Символ
1
@Glyph, вы говорите о параллелизме, но ... ни Gevent, ни Twisted не поддерживают параллелизм (конечно, вы можете использовать многопроцессорность с gevent и использовать пул реальных потоков и пул гринлетов в каждом потоке - что отлично работает для меня и Вы можете использовать Twisted плагин, чтобы сделать то же самое - запустить несколько витых экземпляров рядом друг с другом). Но разве Twisted дает вам нечто большее, чем Gevent? Я думаю, что даже при наличии нескольких экземпляров gevent / twisted gevent легче понять и избежать без явных обратных вызовов. Я что-то упускаю?
Войцех Данило
2
@ danilo2 Да, ты упускаешь хотя бы одну вещь :). В частности, вы неправильно понимаете слово «параллелизм», означающее «параллельное параллельное выполнение на нескольких процессорах». Twisted может выполнять параллельное планирование ввода / вывода через асинхронный (на основе обратного вызова) ввод / вывод. GEvent может выполнять параллельное планирование ввода-вывода через планировщик микропотоков. В Twisted, используя spawnProcessэто планирование ввода / вывода, можно также преобразовать в планирование ЦП.
Символ
48

Мне нравится ответ @Glyph. Twisted - это очень всеобъемлющий, богатый Python Framework. Twisted и Tornado имеют очень похожий дизайн. И мне очень нравится этот дизайн:

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

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

Codebase

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

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

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

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

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

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

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

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

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

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

Резюме

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

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

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

Роберт Заремба
источник
15

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

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

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

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

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

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

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

Эрик Каплун
источник