Wann Tornado zu verwenden ist, wann Twisted / Cyclone / GEvent / other zu verwenden ist [geschlossen]

181

Welches dieser Frameworks / Bibliotheken eignet sich am besten zum Erstellen moderner Mehrbenutzer-Webanwendungen? Ich hätte gerne einen asynchronen Webserver, mit dem ich einfach skalieren kann. Welche Lösung bietet die beste Leistung / Skalierbarkeit / das nützlichste Framework ? (in Bezug auf Benutzerfreundlichkeit und einfache Entwicklung)?

Es wäre großartig, wenn es eine gute Funktionalität bieten würde (Websockets, RPC, Streaming usw.).

Was sind die Vor- und Nachteile jeder Lösung?

Wojciech Danilo
quelle
Muss es eines dieser Frameworks sein? Was haben Sie vor und könnte so etwas wie Django, Pylons usw. funktionieren?
Joe Doherty
Nein, natürlich nicht, aber ich würde es lieben, wenn es asynchron wäre und eine gute Unterstützung für Websockets hätte - ich habe die Frage auch aktualisiert. Danke dir.
Wojciech Danilo
3
Eine ziemlich breite Frage, nicht wahr?
Jean-Paul Calderone
Ihre Wahl hängt von den Bibliotheken ab, die Sie verwenden möchten. Ihre Bibliotheken - auf Aufgabe, die Sie lösen möchten.
Nikolay Fominyh
1
Ja, es ist breit, aber möglicherweise lösbar. Ich frage mich, ob diese Bibliotheken in der Produktion verwendet werden und jemand, der einige von ihnen täglich verwendet, kann sagen, wofür sie großartig sind, was ihnen fehlt usw. Was sollte die Basis für die Auswahl einer Bibliothek sein - vielleicht sollte Twisted sein Wenn man über Autobahn oder Zyklon spricht, wird dies als abgeschrieben angesehen? Oder sind Autobahn und Cyclone möglicherweise nicht produktionsbereit und ihre Wartung ist fraglich? Oder vielleicht hat Tornado ein moderneres Design und seine Zukunft wird wahrscheinlich glänzend und großartig sein und es sollte DIE Wahl für ein Startup-Projekt sein?
Wojciech Danilo

Antworten:

225

" Django ist ein Python-Webframework auf hoher Ebene, das eine schnelle Entwicklung und ein sauberes, pragmatisches Design fördert . " Wenn Sie etwas erstellen, das einer E-Commerce-Website ähnelt, sollten Sie sich wahrscheinlich für Django entscheiden. Es wird Ihre Arbeit schnell erledigen. Sie müssen sich nicht um zu viele Technologieoptionen kümmern. Es bietet alles, was Sie von der Template Engine bis zum ORM benötigen. Es wird eine leichte Meinung darüber sein, wie Sie Ihre App strukturieren, was gut ist, wenn Sie mich fragen. Und es hat die stärkste Community aller anderen Bibliotheken, was bedeutet, dass einfache Hilfe verfügbar ist.

" Flask ist ein Mikroframework für Python, das auf Werkzeug, Jinja 2 und guten Absichten basiert." .Achtung - "Mikroframework" kann irreführend sein. Dies bedeutet nicht, dass Flask eine halbgebackene Bibliothek ist. Dies bedeutet, dass der Kern des Kolbens sehr, sehr einfach ist. Im Gegensatz zu Django werden keine Technologieentscheidungen für Sie getroffen. Sie können jede Template-Engine oder ORM auswählen, die Ihnen gefällt. Obwohl es standardmäßig mit der Jinja Template Engine geliefert wird, können Sie jederzeit unsere eigene auswählen. Soweit ich weiß, ist Flask nützlich, um API-Endpunkte (RESTful-Services) zu schreiben.

" Twisted ist eine ereignisgesteuerte Netzwerk-Engine, die in Python geschrieben wurde" . Dies ist ein Hochleistungsmotor. Der Hauptgrund für seine Geschwindigkeit ist etwas, das als verzögert bezeichnet wird. Twisted baut auf aufgeschobenen Daten auf. Für diejenigen unter Ihnen, die nichts über Verzögerungen wissen, ist es der Mechanismus, der durch asynchrone Architektur erreicht wird. Verdreht ist sehr schnell. Ist aber nicht zum Schreiben herkömmlicher Webapps geeignet. Wenn Sie etwas auf niedriger Ebene vernetzen möchten, ist Twisted Ihr Freund.

" Tornado ist ein Python-Webframework und eine asynchrone Netzwerkbibliothek, die ursprünglich bei FriendFeed entwickelt wurden. Durch die Verwendung nicht blockierender Netzwerk-E / A kann Tornado auf Zehntausende offener Verbindungen skaliert werden, was es ideal für lange Abfragen, WebSockets und andere Anwendungen macht das erfordert eine langlebige Verbindung zu jedem Benutzer " . Tornado steht irgendwo zwischen Django und Flask. Wenn Sie etwas mit Django oder Flask schreiben möchten, aber eine bessere Leistung benötigen, können Sie sich für Tornado entscheiden. Es kann C10k-Probleme sehr gut behandeln, wenn es richtig aufgebaut ist.

" Cyclone ist ein Webserver-Framework für Python, das die Tornado-API als Twisted-Protokoll implementiert . " Was ist, wenn Sie etwas wollen, das fast so performant ist wie Twisted, aber einfach zu schreibende herkömmliche Webapps? Begrüßen Sie den Zyklon. Ich würde Cyclone Tornado vorziehen. Es hat eine API, die Tornado sehr ähnlich ist. In der Tat ist dies eine Gabelung des Tornados. Das Problem ist jedoch, dass es eine relativ kleine Gemeinschaft gibt. Alexandre Fiori ist der einzige Hauptverantwortliche für das Repo.

" Pyramid ist ein allgemeines Open-Source-Framework für die Entwicklung von Python-Webanwendungen. Sein Hauptziel ist es, einem Python-Entwickler das Erstellen von Webanwendungen zu erleichtern." Ich habe Pyramid nicht wirklich benutzt, aber ich habe die Dokumentation durchgesehen. Soweit ich weiß, ist Pyramid Flask sehr ähnlich, und ich denke, Sie können Pyramid überall dort verwenden, wo Flask angemessen erscheint, und umgekehrt.

EDIT : Bitte um Überprüfung anderer Frameworks ist willkommen!

Quelle: http://dhilipsiva.com/2013/05/19/python-libraries-django-twisted-tornado-flask-cyclone-and-pyramid.html

Dhilipsiva
quelle
1
Django ist mein bevorzugter Rahmen. Die Dokumentation ist sehr gut und das ORM ist einfach. South eignet sich hervorragend für Migrationen von Datenbankschemata. Die Frage enthielt jedoch Folgendes: "Ich hätte gerne einen asynchronen Webserver, mit dem ich einfach skalieren kann." Django wurde für klassische Request + Response-Sites entwickelt, nicht für Async.
Guettli
1
Kannst du über Pyramid schreiben?
Fizer Khan
5
@FizerKhan: Gemäß Ihrer Anfrage habe ich die Antwort aktualisiert. Entschuldigung, es hat so lange gedauert. Ich hatte keine Zeit, Pyramid zu benutzen. Aber ich habe die Dokumentation durchgesehen.
Dhilipsiva
1
Ich möchte hinzufügen, dass die Single-Thread-Umgebung, die Tornado verwendet, viel fehleranfälliger ist - ein Fehler, der den Code für einen einzelnen API-Endpunkt langsamer macht, führt leicht zu Problemen für alle Endpunkte.
Abel Molina
1
Könnten Sie einen Kommentar zu cherrypy abgeben?
Stavros Avramidis
60

Dies ist offensichtlich eine etwas voreingenommene Antwort, aber das ist nicht dasselbe wie eine falsche Antwort; Sie sollten immer Twisted verwenden. Ich habe bereits ähnliche Fragen beantwortet , aber da Ihre Frage nicht ganz dieselbe ist, gibt es einige Gründe:

"Beste Leistung"

Twisted überwacht kontinuierlich unsere Leistung auf der Website speed.twistedmatrix.com . Wir waren auch eines der ersten Projekte , die von PyPys ähnlicher Site überwacht wurden , wodurch die gute Leistung von Twisted zur Laufzeit sichergestellt wurde, die jeder hat, der sich mit Hochleistungsanwendungen in Python befasst.

"Skalierbarkeit"

Meines Wissens hat keines der aufgelisteten Frameworks eine integrierte Unterstützung für die automatische Skalierung. Sie sind alle Kommunikations-Frameworks, daher müssen Sie die Arbeit erledigen, um zwischen Ihren Skalierungsknoten zu kommunizieren. Twisted hat jedoch einen Vorteil in seiner integrierten Unterstützung für die lokale Mehrfachverarbeitung . Fairerweise gibt es für Tornado ein Add-On von Drittanbietern , mit dem Sie dasselbe tun können. In den letzten Versionen hat Twisted Funktionen hinzugefügt , die die Anzahl der Möglichkeiten erhöhen, wie Sie die Arbeit zwischen Kernen teilen können. In diesem Bereich wird derzeit gearbeitet. Twisted verfügt außerdem über einige gut integrierte , "native" RPC-Protokolle, die einen Baukasten für jede Skalierungssprache bieten, die Sie verfolgen möchten.

"Am besten brauchbar"

Viele Leute scheinen Twisted sehr nützlich zu finden . So sehr, dass viele von ihnen es erweitert und Ihnen ihre Erweiterungen zur Verfügung gestellt haben.

"Funktionalität"

Im Lieferumfang von Twisted sind enthalten:

Zumindest in dieser letzten Abteilung scheint Twisted ein klarer Gewinner für integrierte Funktionen zu sein. Und das alles in einem Paket von etwas mehr als 2 Megabyte!

Glyphe
quelle
6
Warum sagen so viele Leute, dass sie Twisted nicht mehr verwenden, sondern GEvent?
Remdezx
1
Es gibt viele Leute, die sagen, dass es schwierig ist, große Anwendungen mit Twisted zu warten (aufgrund seiner Callback-Architektur): stackoverflow.com/questions/3048012/… Wäre es nicht besser, gevent oder gevent-basiertes Twisted zu verwenden?
Wojciech Danilo
8
@remdezx Bei Ihrer Frage gibt es zwei Gründe. Zum einen ist Twisted schwer zu verstehen, da die gleichzeitige Programmierung schwer zu verstehen ist. Sie wechseln dann zu GEvent, weil es oberflächlich leicht zu verstehen ist - solange es keine Parallelität gibt, funktioniert alles so, wie Sie es erwarten würden. Der andere Grund ist, dass es viel weniger Arbeit ist, Code auf GEvent zu portieren, der nicht mit einer ereignisgesteuerten API geschrieben wurde, um die Leistungsvorteile ereignisgesteuerter E / A zu nutzen. Wenn Ihr Code nicht zu viel Status hat, funktioniert ein solcher Port wahrscheinlich einwandfrei.
Glyphe
1
@Glyph, Sie sprechen von Parallelität, aber ... weder Gevent noch Twisted unterstützen Parallelität (natürlich können Sie Multiprocessing mit Gevent verwenden und einen Pool von echten Threads und einen Pool von Greenlets für jeden Thread verwenden - was für mich und gut funktioniert Sie können das Twisted-Plugin verwenden, um genau das Gleiche zu tun (mehrere Twisted-Intances nebeneinander ausführen). Aber gibt Ihnen Twisted etwas mehr als Gevent? Ich denke, selbst bei mehreren Instanzen von Gevent / Twisted ist Gevent leichter zu verstehen und ohne seine expliziten Rückrufe. Vermisse ich etwas
Wojciech Danilo
2
@ danilo2 Ja, dir fehlt mindestens eine Sache :). Insbesondere missverstehen Sie das Wort "Parallelität" als "gleichzeitige parallele Ausführung auf mehreren CPUs". Twisted kann die gleichzeitige E / A-Planung über asynchrone (rückrufbasierte) E / A durchführen. GEvent kann die gleichzeitige E / A-Planung über einen Micro-Thread-Scheduler durchführen. In Twisted kann spawnProcessdiese E / A-Planung mithilfe von auch in die CPU-Planung übersetzt werden.
Glyphe
48

Ich mag @Glyph Antwort. Twisted ist ein sehr umfassendes, reichhaltiges Python-Framework. Twisted und Tornado haben ein sehr ähnliches Design. Und ich mag dieses Design sehr:

  • Es ist schnell
  • einfach zu verstehen
  • einfach zu erweitern
  • erfordert keine c-Erweiterungen
  • funktioniert auf PyPy.

Aber ich möchte Tornado hervorheben , den ich bevorzuge und der in letzter Zeit an Popularität gewinnt. Tornado verwendet wie Twisted die Programmierung im Rückrufstil, kann jedoch mithilfe von tornado.gen.engine( twisted.internet.inlineCallbacksin Twisted) eingebunden werden .

Codebasis

Der beste Kommentar stammt von der Website http://cyclone.io . Zyklon versucht Twisted und Tornado zu mischen, weil:

Twisted ist eine der ausgereiftesten Bibliotheken für nicht blockierende E / A, die der Öffentlichkeit zur Verfügung stehen. Tornado ist die Open-Source-Version des Webservers von FriendFeed, einem der beliebtesten und schnellsten Webserver für Python, mit einer sehr anständigen API zum Erstellen von Webanwendungen.

Die Idee ist, Tornados elegante und unkomplizierte API mit Twisted's Event-Loop zu verbinden und so eine Vielzahl unterstützter Protokolle zu ermöglichen.

Aber im Jahr 2011 tornado.platform.twistedwar heraus, was ähnliche Funktionen bringt.

Performance

Tornado hat eine viel bessere Leistung . Es funktioniert auch nahtlos mit PyPy und erzielt einen enormen Gewinn.

Skalierbarkeit

Das gleiche wie Twisted. Tornado hat tornado.processund viele RPC-Dienste darüber implementiert.

Funktionalität

Es gibt 71 Tornado-basierte Pakete im Vergleich zu 148 Twisted's und 48 Gevent's. Wenn Sie jedoch genau hinschauen und den Median der Upload-Zeit für Pakete berechnen, werden Sie feststellen, dass Twisted die ältesten und Gevent und Tornado die frischesten sind. Darüber hinaus gibt es ein tornado.platform.twistedModul, mit dem Sie Code ausführen können, der für Twisted on Tornado geschrieben wurde .

Zusammenfassung

Mit Tornado können Sie einen Code von Twisted verwenden. Es ist nicht erforderlich, einen Zyklon zu verwenden, der nur Ihren Code verdreht (Ihr Code wird unordentlicher).

Für 2014 gilt Tornado als allgemein anerkanntes und standardmäßiges asynchrones Framework, das sowohl auf Python2 als auch auf Python3 funktioniert. Auch die neueste Version 4.x bietet viele Funktionen von https://docs.python.org/dev/library/asyncio.html .

Ich schrieb einen Artikel, in dem erklärt wurde, warum ich diesen Tornado für das beste Python-Webframework halte, in dem ich viel mehr über die Tornado-Funktionalität geschrieben habe.

Robert Zaremba
quelle
15

( UPDATE : Ich bin traurig überrascht, wie wenige Antworten hier Gevent empfehlen oder sogar erwähnen - ich denke nicht, dass dies im Verhältnis zur Popularität, Leistung und Benutzerfreundlichkeit dieser hervorragenden Bibliothek steht!)

Gevent und Twisted schließen sich nicht gegenseitig aus, auch wenn das Gegenteil zunächst offensichtlich erscheint. Es gibt ein Projekt namens, geventreactordas es einem ermöglicht, das Beste aus beiden Welten relativ reibungslos zu nutzen, nämlich:

  • Das effiziente und billige (kooperative grüne) Thread-Modell von Gevent, das inlineCallbacksin Bezug auf Parallelität viel einfacher zu programmieren ist - ehrlich gesagt ist Twisted's in Bezug auf die Leistung bei vielen Coroutinen einfach nicht der Aufgabe gewachsen, und auch nicht in Bedingungen für Benutzerfreundlichkeit / Transparenz: yieldund Deferredsüberall; oft schwer, einige Abstraktionen zu erstellen; schrecklich nutzlose Stapelspuren sowohl mit nackten Deferreds als auch und noch mehr mit @inlineCallbacks.
  • Alle integrierten Funktionen von Twisted, von denen Sie jemals träumen können, einschließlich, aber nicht beschränkt auf IReactorProcess.spawnProcess.

Ich persönlich verwende derzeit Gevent 1.0rc2 mit Twisted 12.3, das von überbrückt wird geventreactor. Ich habe meine eigenen, noch nicht veröffentlichten Ergänzungen und Verbesserungen implementiert, geventreactordie ich bald veröffentlichen werde, hoffentlich als Teil des geventreactorursprünglichen GitHub-Repositorys: https://github.com/jyio/geventreactor .

Mein aktuelles Layout ermöglicht es mich zu Programm im schönen Programmiermodell von GEVENT und Hebel Dingen wie eine nicht-blockierende socket, urllib2und anderen Module. Ich kann normalen Python-Code verwenden, um normale Dinge zu erledigen, im Gegensatz zu der Lernkurve und der Unannehmlichkeit, selbst einfache, grundlegende Dinge auf verdrehte Weise zu erledigen. Ich kann auch problemlos die meisten Bibliotheken von Drittanbietern verwenden, die normalerweise entweder mit Twisted nicht in Frage kommen oder die Verwendung von Threads erfordern.

Ich kann auch die umständliche und oft zu komplexe, auf Rückrufen basierende Programmierung vollständig vermeiden, indem ich Greenlets verwende (anstelle von Deferreds und Rückrufen und / oder @inlineCallbacks).

(Diese Antwort basiert auf meinen persönlichen Erfahrungen mit Twisted und Gevent in realen Projekten, mit deutlich mehr Erfahrung mit Twisted (aber ich behaupte nicht, ein Twisted-Experte zu sein). Die Software, die ich schreiben musste, ist nicht vorhanden Es mussten nicht zu viele Funktionen von Twisted verwendet werden. Abhängig von den Funktionen, die Sie für Twisted benötigen, ist die (relativ schmerzlose) zusätzliche Komplexität beim Mischen von Gevent und Twisted möglicherweise nicht die Mühe wert.)

Erik Kaplun
quelle