it-swarm.com.de

Wann ist Tornado anzuwenden, wann Twisted / Cyclone / GEvent / Sonstiges?

Welches dieser Frameworks/Bibliotheken ist die beste Wahl für die Erstellung einer modernen Mehrbenutzer-Webanwendung? Ich hätte gerne einen asynchronen Webserver, mit dem ich einfach skalieren kann. Welche Lösung ergibt die beste Leistung/Skalierbarkeit/nützlichstes Framework (in Bezug auf einfache Verwendung und einfache Entwicklung)?

Es wäre toll, wenn es gute Funktionalität (Websockets, RPC, Streaming, etc.) zur Verfügung stellen würde.

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

180
Wojciech Danilo

"Django ist ein High-Level-Webframework Python, das eine schnelle Entwicklung fördert und sauberes, pragmatisches Design ". Wenn Sie etwas erstellen, das einer E-Commerce-Site ähnelt, sollten Sie sich wahrscheinlich für Django entscheiden. Es wird Ihre Arbeit schnell erledigen. Sie müssen sich nicht um zu viele technologische Entscheidungen kümmern. Es bietet alles, was Sie brauchen, von der Template-Engine bis zum ORM. Es wird ein wenig über die Art und Weise, wie Sie Ihre App strukturieren, diskutiert, was gut ist, wenn Sie mich fragen. Und es hat die stärkste Community aller anderen Bibliotheken, was bedeutet, dass eine einfache Hilfe verfügbar ist.

"Flask ist ein Microframework für Python basierend auf Werkzeug, Jinja 2 und gute Absichten". Vorsicht - "Microframework" kann irreführend sein. Dies bedeutet nicht, dass Flask eine halbgebackene Bibliothek ist. Das heißt, der Kern von flask ist sehr, sehr einfach. Im Gegensatz zu Django wird es keine technologischen Entscheidungen für Sie treffen. Sie können jede Template-Engine oder ORM wählen, die Ihnen gefällt. Auch wenn es standardmäßig mit der Jinja Template Engine geliefert wird, können Sie immer 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 ist" . Dies ist ein Hochleistungsmotor. Der Hauptgrund für seine Geschwindigkeit ist etwas, das als aufgeschoben bezeichnet wird. Twisted baut auf Aufschüben auf. Für diejenigen von Ihnen, die nicht über Aufschübe wissen, ist es der Mechanismus, durch den die asynchrone Architektur erreicht wird. Verdreht ist sehr schnell. Ist aber nicht zum Schreiben von herkömmlichen Webapps geeignet. Wenn Sie etwas Vernetztes tun möchten, ist Twisted Ihr Freund.

"Tornado ist ein Python - Webframework und eine asynchrone Netzwerkbibliothek, die ursprünglich entwickelt wurden Durch die Verwendung von nicht blockierenden Netzwerk-E/A kann Tornado auf Zehntausende von offenen Verbindungen skaliert werden und eignet sich daher ideal für lange Abfragen, WebSockets und andere Anwendungen, die eine langlebige Verbindung zu jedem Benutzer erfordern. ". 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 das C10k-Problem sehr gut bewältigen, wenn es richtig aufgebaut ist.

"Cyclone ist ein Webserver-Framework für Python, das die Tornado-API implementiert als verdrehtes Protokoll ". Was ist, wenn Sie etwas wollen, das fast so performant ist wie Twisted, aber das Schreiben herkömmlicher Webapps einfach ist? Sag hallo zum Zyklon. Ich würde Cyclone dem Tornado vorziehen. Es hat eine API, die Tornado sehr ähnlich ist. Tatsächlich ist dies eine Gabelung von Tornado. Aber das Problem ist, dass es eine relativ kleine Community gibt. Alexandre Fiori ist der einzige Hauptverantwortliche für das Repo.

"Pyramid ist ein allgemeines Open Source Python - Framework für die Entwicklung von Webanwendungen Das Hauptziel ist es, einem Python Entwickler das Erstellen von Webanwendungen zu erleichtern. " Ich habe Pyramid nicht wirklich verwendet, aber ich habe die Dokumentation durchgearbeitet. 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 [~ # ~] : Anfragen zur Überprüfung anderer Frameworks sind willkommen !

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

217
dhilipsiva

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

"Beste Leistung"

Twisted überwacht kontinuierlich unsere Leistung auf der Website speed.twistedmatrix.com . Wir waren auch eines der ersten Projekte das von PyPys ähnlicher Site überwacht werden sollte , wodurch die gute Leistung von Twisted zur Laufzeit für alle sichergestellt wird, die sich mit Hochleistungsanwendungen in Python befassen.

"Skalierbarkeit"

Meines Wissens verfügt keines der aufgelisteten Frameworks über eine integrierte Unterstützung für die automatische Skalierung. Sie sind alle Kommunikations-Frameworks, daher müssen Sie die Arbeit für die Kommunikation zwischen Ihren Skalierungsknoten erledigen. Twisted hat jedoch einen Vorteil in seiner eingebaute Unterstützung für lokale Multi-Processing . Fairerweise gibt es ein Drittanbieter-Add-On für Tornado , mit dem Sie dasselbe tun können. In neueren Versionen wurde Twisted hat Funktionen hinzugefügt hinzugefügt, die die Anzahl der Möglichkeiten erhöhen, wie Sie die Arbeit zwischen Kernen teilen können. In diesem Bereich wird noch gearbeitet. Twisted hat auch ein paar 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 zu finden sehr nützlich . 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!

57
Glyph

Ich mag @ Glyph Antwort. Twisted ist ein sehr umfassendes, umfangreiches python Framework. Twisted und Tornado haben ein sehr ähnliches Design. Und dieses Design gefällt mir sehr gut:

  • es ist schnell
  • einfach zu verstehen
  • einfach zu erweitern
  • benötigt keine c-extensions
  • arbeitet an PyPy.

Aber ich möchte Tornado hervorheben, was ich bevorzuge und in letzter Zeit an Popularität gewinne. Tornado verwendet wie Twisted Callback-Programmierung, kann jedoch mit tornado.gen.engine (twisted.internet.inlineCallbacks in Twisted).

Codebasis

Der beste Kommentar stammt von der http://cyclone.io Seite. cyclone 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 von FriendFeeds Webserver, einem der beliebtesten und schnellsten Webserver für Python, mit einer sehr anständigen API zum Erstellen von Webanwendungen.

Die Idee ist, die elegante und unkomplizierte API von Tornado mit Twisted's Event-Loop zu verbinden und eine Vielzahl von unterstützten Protokollen zu ermöglichen.

Aber im Jahr 2011 tornado.platform.twisted war raus, was ähnliche Funktionalität bringt.

Performance

Tornado hat viel besser Leistung . Es funktioniert auch nahtlos mit PyPy und bringt enormen Gewinn.

Skalierbarkeit

Das gleiche wie Twisted. Tornado hat tornado.process und viele darauf implementierte rpc-dienste.

Funktionalität

Es gibt 71 Tornado-basierte Pakete, verglichen mit 148 Twisted-Paketen und 48 Gevent-Paketen. Wenn Sie jedoch genau hinschauen und den Median der Upload-Zeit für Pakete berechnen, werden Sie feststellen, dass Twisted-Pakete die ältesten und Gevent und Tornado die frischesten sind. Außerdem gibt es tornado.platform.twisted Modul, 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 muss kein Zyklon verwendet werden, der nur Twists Ihren Code enthält (Ihr Code wird unordentlicher).

Seit 2014 gilt Tornado als weit verbreitetes und standardmäßiges asynchrones Framework, das sowohl auf Python2 als auch auf Python3 funktioniert. Auch die neueste Version 4.x bringt viele Funktionen von https://docs.python.org/dev/library/asyncio.html .

Ich habe einen Artikel geschrieben, in dem erklärt wird, warum ich das für richtig halte Tornado - das beste Python Web-Framework , in dem ich viel mehr über die Tornado-Funktionalität geschrieben habe.

47
Robert Zaremba

( [~ # ~] update [~ # ~] : Ich bin traurig darüber überrascht, wie wenige Antworten hier Gevent empfehlen oder sogar erwähnen - ich weiß nicht. ' Ich denke nicht, dass es im Verhältnis zur Popularität, Leistung und Benutzerfreundlichkeit dieser exzellenten Bibliothek steht!)

Gevent und Twisted schließen sich nicht gegenseitig aus, auch wenn das Gegenteil zunächst offensichtlich erscheinen mag. Es gibt ein Projekt namens geventreactor, mit dem man das Beste aus beiden Welten relativ reibungslos nutzen kann:

  • Das effiziente und kostengünstige (kooperative, grüne) Thread-Modell von Gevent, das im Hinblick auf die Parallelität viel einfacher zu programmieren ist - ehrlich gesagt ist Twisteds inlineCallbacks hinsichtlich der Leistung einfach nicht der Aufgabe gewachsen viele Koroutinen, und auch nicht in Bezug auf Benutzerfreundlichkeit/Transparenz der Verwendung: yield und Deferreds überall; oft schwierig, einige Abstraktionen zu erstellen; Schrecklich nutzlose Stapelspuren sowohl mit nackten Deferreds als auch und noch mehr mit @inlineCallbacks.
  • Die gesamte integrierte Funktionalität von Twisted, von der Sie jemals träumen können, einschließlich, aber nicht beschränkt auf IReactorProcess.spawnProcess.

Ich persönlich benutze derzeit Gevent 1.0rc2 mit Twisted 12.3, das von geventreactor überbrückt wurde. Ich habe meine eigenen, noch nicht veröffentlichten Ergänzungen und Verbesserungen an geventreactor implementiert, die ich bald veröffentlichen werde, hoffentlich als Teil von geventreactors ursprünglichem GitHub-Repository: https: // github .com/jyio/geventreactor .

Mein aktuelles Layout ermöglicht es mir, das Nice-Programmiermodell von Gevent zu programmieren und Dinge wie ein nicht blockierendes socket, urllib2 und andere Module. Ich kann regulären Python Code verwenden, um reguläre Dinge zu erledigen, im Gegensatz zur Lernkurve und der Unbequemlichkeit, auch einfache, grundlegende Dinge auf verdrehte Weise zu erledigen. Ich kann auch die meisten Bibliotheken von Drittanbietern verwenden, die es sind Normalerweise kommt dies bei Twisted nicht in Frage oder erfordert die Verwendung von Gewinden.

Ich kann die umständliche und oft übermäßig komplexe Callback-basierte Programmierung auch vollständig vermeiden, indem ich Greenlets (anstelle von Deferreds und Callbacks und/oder @inlineCallbacks).

(Diese Antwort wurde auf der Grundlage meiner persönlichen Erfahrungen mit Twisted und Gevent in realen Projekten verfasst, wobei ich deutlich mehr Erfahrung mit Twisted habe (aber ich behaupte nicht, Twisted-Experte zu sein). Die Software, die ich schreiben musste, hat noch keine Es mussten nicht zu viele Twisted-Funktionen verwendet werden. Abhängig von den Funktionen, die Sie für Twisted benötigen, ist die (relativ schmerzfreie) zusätzliche Komplexität des Mischens von Gevent und Twisted möglicherweise nicht die Mühe wert.)

15
Erik Allik