Diferencias entre node.js y Tornado [cerrado]

79

Además del hecho de que node.js está escrito en JS y Tornado en Python, ¿cuáles son algunas de las diferencias entre los dos? Ambos son servidores web asincrónicos sin bloqueo, ¿verdad? ¿Por qué elegir uno sobre el otro además del idioma?

molinillo de cafe
fuente

Respuestas:

97

La principal ventaja de node.js es que todas sus bibliotecas son asincrónicas, por lo que no tiene que preocuparse mucho por el bloqueo. Hay bibliotecas asíncronas para mysql, postgres, redis, etc. Todo es asíncrono por defecto.

Python tiene una biblioteca para cualquier cosa, pero la mayoría de estas bibliotecas no son asincrónicas. Para aprovechar tornado (y no bloquear el proceso) se necesitan bibliotecas especiales (por ejemplo, no puede simplemente 'pip install redis' y usarlo, necesitará algo como brukva ), y hay mucho menos bibliotecas tornado que las bibliotecas node.js. No hay ningún controlador de tornado async mysql disponible en este momento, por ejemplo (o al menos no lo sé).

Pero aún puede usar muchas bibliotecas de Python con tornado (aquellas que no hacen E / S), y la comunidad de tornado está aumentando y llenando los vacíos.

En mi experiencia, es más fácil escribir una aplicación usando node.js que usando tornado. Personalmente, cambié a tornado de node.js porque encaja mejor en la infraestructura existente de mi proyecto de Python (la integración entre el sitio de Django que sirve páginas html y el servidor Tornado que proporciona funciones en tiempo real fue bastante sencilla).

Mikhail Korobov
fuente
24
Cabe señalar que tornado ahora tiene acceso a todas las bibliotecas asíncronas de twisted (consulte tornadoweb.org/documentation/twisted.html ). Y sin embargo, la pregunta original propone explícitamente no tener en cuenta el lenguaje, es importante que Python tenga generadores y faciliten mucho la escritura de código asíncrono: no existe tal cosa en javascript. Hay docenas de bibliotecas que intentan solucionar el rendimiento faltante en V8 (Step, etc.) pero sin soporte de lenguaje, tienen una sintaxis no tan bonita y manejan menos casos extremos que el 'rendimiento' de Python.
Mikhail Korobov
1
Mikhail, te equivocas acerca de la falta de soporte para generadores en JavaScript. Consulte la información sobre la implementación de generadores en JavaScript 1.7 (y tenga en cuenta que la versión actual, 1.8.2, es de mediados de 2009): Nuevo en JavaScript 1.7: Generadores .
Tadeck
8
El lenguaje que usa node.js no es Javascript 1.7 o 1.8, está más cerca de ECMAScript5. Esto se debe a que node.js usa un motor V8 que no implementa todas las funciones de JavaScript 1.7 (consulte code.google.com/p/v8/issues/detail?id=890 ). Esto puede cambiar en el futuro, y puede haber razones válidas para ello (por ejemplo, JS 1.7 no es un estándar), pero JavaScript 1.7 se introdujo en 2006 y 'rendimiento' no está en la v8 en 2012.
Mikhail Korobov
3
Tienes razón, de alguna manera interpreté tu comentario como si dijeras que JavaScript no tiene generadores. Mi error.
Tadeck
4
¿Esta respuesta se actualiza después de 2 años?
nkint
13

Como Rich Bradshaw señala, Node.js está escrito en JS, lo que significa que puede mantener el front-end y el back-end en el mismo idioma y posiblemente compartir algún código base. Para mí, ese es un gran beneficio potencial de Node.js . Node también viene con más bibliotecas asincrónicas listas para usar.

V8 debería hacer que JS sea más rápido que Python, al menos eso es lo que parecen sugerir los puntos de referencia , pero puede que no importe mucho, porque tanto Node.js como Tornado (y la mayoría de los otros marcos web para el caso) usan envoltorios para bibliotecas nativas. Gran parte de la biblioteca estándar de Python está escrita en C o se puede reemplazar por una alternativa más rápida, lo que mitiga aún más las posibles diferencias.

Los servicios web suelen estar vinculados a E / S, lo que significa que pasamos el tiempo esperando el almacén de datos y no procesando los datos. Eso hace que la diferencia de velocidad sintética entre JS y Python sea irrelevante en muchas aplicaciones.

Morten Jensen
fuente
1
Punto de vista muy correcto
securecurve
10

node.js usa V8 que se compila en código ensamblador, tornado aún no lo hace.

Aparte de eso (que en realidad no parece hacer mucha diferencia en la velocidad), es el ecosistema. ¿Prefieres el modelo de eventos de JS o la forma en que funciona Python? ¿Está más contento con las bibliotecas Python o JS?

Rich Bradshaw
fuente
6
Simplemente ejecuto httperf contra aplicaciones helloworld simples de un solo proceso. Tornado en PyPy 1.8 (~ 8k req / s) no está muy por detrás del rendimiento de Node (~ 11k req / s).
jholster
2
V8 se compila en código de máquina, no en ensamblado. Y es importante que la compilación sea justo a tiempo y no estática: en.wikipedia.org/wiki/V8_(JavaScript_engine)
Max Heiber
3

Nodejs también tiene una integración / implementación perfecta de websockets llamada Socket.io. Maneja navegadores compatibles con sockets - eventos y también tiene compatibilidad de sondeo hacia atrás para navegadores más antiguos. Es bastante rápido en el desarrollo que requiere un marco de notificación o alguna programación similar basada en eventos.

Sushant Khurana
fuente
Bueno, hay socketTornad, que es una implementación bifurcada de socket.io que depende únicamente de cuándo llega la próxima actualización en términos de soporte. El objetivo de mencionar esto aquí fue la belleza de socket.io en nodejs, que reduce el manejo de muchos escenarios.
Sushant Khurana
6
No tengo idea de lo que estás hablando. Ese proyecto es antiguo y obsoleto. Tornadio se mantiene actualizado con los lanzamientos de referencia de socket.io: github.com/MrJoes/tornadio2
jdi
3

Te sugiero que vayas con NodeJS, si no hay una preferencia personal para Python. Me gusta mucho Python, pero para async elijo Tornado sobre el nodo, y luego tuve que luchar para encontrar la manera de hacer algo, o bibliotecas con soporte async (como Cassandra tiene async en las pruebas, pero en ninguna parte pude encontrar la forma de usar cqlengine con async. Tuve que elegir Mongo porque ya superé el plazo). En términos de rendimiento y asíncrono, Node es mucho mejor que tornado.

Ravi Kumar
fuente