Unterschiede zwischen node.js und Tornado [geschlossen]

78

Was sind neben der Tatsache, dass node.js in JS und Tornado in Python geschrieben ist, einige der Unterschiede zwischen den beiden? Sie sind beide nicht blockierende asynchrone Webserver, oder? Warum neben der Sprache eine über die andere wählen?

Kaffeemühle
quelle

Antworten:

96

Der Hauptvorteil von node.js besteht darin, dass alle Bibliotheken asynchron sind, sodass Sie sich nicht viel Gedanken über das Blockieren machen müssen. Es gibt asynchrone Bibliotheken für MySQL, Postgres, Redis usw. Standardmäßig ist alles asynchron.

Python hat eine Bibliothek für alles - aber die meisten dieser Bibliotheken sind nicht asynchron. Um Tornado zu nutzen (und den Prozess nicht zu blockieren), sind spezielle Bibliotheken erforderlich (z. B. können Sie Redis nicht einfach 'pip install' und verwenden, Sie benötigen so etwas wie brukva ), und es gibt viel weniger Tornado-Bibliotheken als node.js-Bibliotheken. Derzeit ist beispielsweise kein asynchroner MySQL-Tornado-Treiber verfügbar (oder zumindest ist mir dies nicht bekannt).

Sie können jedoch immer noch viele Python-Bibliotheken mit Tornado verwenden (solche, die keine E / A ausführen), und die Tornado-Community vergrößert und füllt die Lücken.

Nach meiner Erfahrung ist es einfacher, eine App mit node.js zu schreiben, als mit Tornado. Ich persönlich bin von node.js zu tornado gewechselt, weil es besser in die vorhandene Infrastruktur meines Python-Projekts passt (die Integration zwischen der Django-Site, die HTML-Seiten bereitstellt, und dem Tornado-Server, der Echtzeitfunktionen bereitstellt, war ziemlich schmerzlos).

Mikhail Korobov
quelle
24
Es sollte beachtet werden, dass Tornado jetzt einen Zugriff auf alle asynchronen Bibliotheken von Twisted hat (siehe tornadoweb.org/documentation/twisted.html ). Und obwohl die ursprüngliche Frage ausdrücklich vorschlägt, die Sprache nicht zu berücksichtigen, ist es wichtig, dass Python über Generatoren verfügt, die das Schreiben von asynchronem Code erheblich erleichtern: In Javascript gibt es so etwas nicht. Es gibt Dutzende von Bibliotheken, die versuchen, die fehlende Ausbeute in V8 (Schritt usw.) zu umgehen, aber ohne Sprachunterstützung haben sie eine nicht so hübsche Syntax und behandeln weniger Randfälle als die 'Ausbeute' von Python.
Mikhail Korobov
1
Mikhail, Sie sind falsch, weil Generatoren in JavaScript nicht unterstützt werden. Weitere Informationen zur Implementierung von Generatoren in JavaScript 1.7 (und beachten Sie, dass die aktuelle Version 1.8.2 ab Mitte 2009 stammt): Neu in JavaScript 1.7: Generatoren .
Tadeck
8
Die Sprache node.js wird nicht in Javascript 1.7 oder 1.8 verwendet, sondern ist näher an ECMAScript5. Dies liegt daran, dass node.js die V8-Engine verwendet, die nicht alle JavaScript 1.7-Funktionen implementiert (siehe code.google.com/p/v8/issues/detail?id=890 ). Dies kann sich in Zukunft ändern, und es kann gültige Gründe dafür geben (z. B. JS 1.7 ist kein Standard), aber JavaScript 1.7 wurde 2006 eingeführt und 'Yield' ist 2012 nicht in Version 8.
Mikhail
3
Sie haben Recht, ich habe Ihren Kommentar irgendwie so interpretiert, als ob Sie sagen würden, dass JavaScript keine Generatoren hat. Mein Fehler.
Tadeck
4
Wird diese Antwort nach 2 Jahren aktualisiert?
Nkint
13

Wie Rich Bradshaw hervorhebt, ist Node.js in JS geschrieben, was bedeutet, dass Sie das Front-End und das Back-End in derselben Sprache halten und möglicherweise eine Codebasis gemeinsam nutzen können. Für mich ist das ein riesiges Potenzial Nutzen von Node.js . Node wird anscheinend auch mit mehr asynchronen Bibliotheken ausgeliefert.

V8 sollte JS schneller als Python machen, zumindest scheinen Benchmarks dies nahezulegen , aber es spielt möglicherweise keine große Rolle, da sowohl Node.js als auch Tornado (und die meisten anderen Web-Frameworks) Wrapper für native Bibliotheken verwenden. Ein Großteil der Python-Standardbibliothek ist in C geschrieben oder kann durch eine schnellere Alternative ersetzt werden, wodurch potenzielle Unterschiede noch weiter gemindert werden.

Webdienste sind normalerweise E / A-gebunden. Das bedeutet, dass wir die Zeit damit verbringen, auf den Datenspeicher zu warten und die Daten nicht zu verarbeiten. Daher ist der synthetische Geschwindigkeitsunterschied zwischen JS und Python in vielen Anwendungen irrelevant.

Morten Jensen
quelle
1
Sehr richtige Sichtweise
Securecurve
10

node.js verwendet V8, das in Assembler-Code kompiliert wird. Tornado macht das noch nicht.

Davon abgesehen (was für die Geschwindigkeit eigentlich keinen großen Unterschied zu machen scheint) ist es das Ökosystem. Bevorzugen Sie das Ereignismodell von JS oder die Funktionsweise von Python? Sind Sie mit Python- oder JS-Bibliotheken zufriedener?

Rich Bradshaw
quelle
6
Ich führe httperf nur gegen einfache Single-Process-Helloworld-Apps aus. Tornado auf PyPy 1.8 (~ 8.000 Anforderungen / s) liegt nicht weit hinter der Leistung von Node (~ 11.000 Anforderungen / s).
Jholster
2
V8 wird nach Maschinencode kompiliert, nicht nach Assembly. Und es ist wichtig, dass die Zusammenstellung eher just-in-time als statisch ist: en.wikipedia.org/wiki/V8_(JavaScript_engine)
Max Heiber
3

Nodejs hat auch eine nahtlose Integration / Implementierung von Websockets namens Socket.io. Es behandelt Browser, die Sockets - Ereignisse unterstützen, und bietet Abwärtsabrufkompatibilität für ältere Browser. Die Entwicklung erfordert ein Benachrichtigungsframework oder eine ähnliche ereignisbasierte Programmierung.

Sushant Khurana
quelle
Nun, es gibt socketTornad, eine gespaltene Implementierung von socket.io, die nur davon abhängt, wann das nächste Update in Bezug auf die Unterstützung eingeht. Der springende Punkt hierbei war die Schönheit von socket.io in nodejs, die die Handhabung vieler Szenarien reduziert.
Sushant Khurana
6
Keine Ahnung wovon du sprichst. Das Projekt ist alt und veraltet. Tornadio bleibt mit den Veröffentlichungen von socket.io auf dem neuesten Stand: github.com/MrJoes/tornadio2
jdi
3

Ich würde vorschlagen, dass Sie sich für NodeJS entscheiden, wenn es keine persönliche Präferenz für Python gibt. Ich mag Python sehr, aber für Async wähle ich Tornado anstelle von Node und musste später Schwierigkeiten haben, einen Weg zu finden, um etwas zu tun, oder Bibliotheken mit Async-Unterstützung (wie Cassandra Async in Tests hat, aber nirgendwo konnte ich Cqlengine verwenden async. Musste Mongo wählen, da ich die Frist bereits überschritten habe). In Bezug auf Leistung und Asynchronität ist Node weitaus besser als Tornado.

Ravi Kumar
quelle