Cuándo usar Tornado, cuándo usar Twisted / Cyclone / GEvent / other [cerrado]

181

¿Cuál de estos marcos / bibliotecas sería la mejor opción para construir aplicaciones web multiusuario modernas? Me encantaría tener un servidor web asíncrono que me permita escalar fácilmente. ¿Qué solución proporcionará el mejor rendimiento / escalabilidad / marco más útil (en términos de fácil de usar y fácil de desarrollar)?

Sería genial si proporcionara una buena funcionalidad (websockets, rpc, transmisión, etc.).

¿Cuáles son los pros y los contras de cada solución?

Wojciech Danilo
fuente
¿Tiene que ser uno de estos marcos? ¿Qué es lo que planeas hacer y podría funcionar algo como Django, Pylons, etc.?
Joe Doherty
No, por supuesto que no, pero me encantaría que fuera asíncrono y tuviera un buen soporte para websockets. También he actualizado la pregunta. Gracias.
Wojciech Danilo
3
Una especie de pregunta amplia, ¿no?
Jean-Paul Calderone
Su elección depende de las bibliotecas que quiera usar. Sus bibliotecas, en la tarea, que desea resolver.
Nikolay Fominyh
1
Sí, es amplio, pero puede ser posible. Me pregunto si estas bibliotecas se usan en producción y si alguien, que usa algunas de ellas todos los días, puede decir para qué son geniales, qué les falta, etc. ¿Cuál debería ser la base para elegir una biblioteca? Quizás Twisted debería ser Considerado depreciado cuando se habla de Autobahn o Ciclón? ¿O mmaybe Autobahn y Cyclone no están listos para la producción y su mantenimiento está en duda? ¿O tal vez Tornado tiene un diseño más moderno y su futuro probablemente será brillante y genial y debería ser LA elección para el proyecto de inicio?
Wojciech Danilo

Respuestas:

226

" Django es un marco web Python de alto nivel que fomenta el desarrollo rápido y el diseño limpio y pragmático" . Si está creando algo similar a un sitio de comercio electrónico, entonces probablemente debería ir con Django. Hará su trabajo rápido. No tiene que preocuparse por demasiadas opciones tecnológicas. Proporciona todo lo que necesita, desde el motor de plantillas hasta ORM. Será un poco obstinado sobre la forma en que estructura su aplicación, lo cual es bueno si me pregunta. Y tiene la comunidad más fuerte de todas las otras bibliotecas, lo que significa que hay ayuda fácil disponible.

" Flask es un microframework para Python basado en Werkzeug, Jinja 2 y buenas intenciones" . Cuidado: el "microframework" puede ser engañoso. Esto no significa que Flask sea una biblioteca a medio cocer. Esto significa que el núcleo del matraz es muy, muy simple. A diferencia de Django, no tomará decisiones tecnológicas por usted. Usted es libre de elegir cualquier motor de plantillas u ORM que le agrade. A pesar de que viene con el motor de plantillas Jinja de forma predeterminada, siempre puede elegir el nuestro. Hasta donde yo sé, Flask es útil para escribir puntos finales de API (servicios RESTful).

" Twisted es un motor de red controlado por eventos escrito en python" . Este es un motor de alto rendimiento. La razón principal de su velocidad es algo llamado diferido. Twisted está construido sobre diferidos. Para aquellos de ustedes que no saben acerca de los defensores, se logra el mecanismo a través de la arquitectura asincrónica. Twisted es muy rápido. Pero no es adecuado para escribir webapps convencionales. Si quieres hacer algo de redes de bajo nivel, Twisted es tu amigo.

" Tornado es un marco web de Python y una biblioteca de red asincrónica, desarrollada originalmente en FriendFeed. Al usar E / S de red sin bloqueo, Tornado puede escalar a decenas de miles de conexiones abiertas, lo que lo hace ideal para sondeos largos, WebSockets y otras aplicaciones que requieren una conexión de larga duración con cada usuario " . Tornado se encuentra en algún lugar entre Django y Flask. Si desea escribir algo con Django o Flask, pero si necesita un mejor rendimiento, puede optar por Tornado. puede manejar el problema de C10k muy bien si está diseñado correctamente.

" Cyclone es un marco de servidor web para Python que implementa la API Tornado como un protocolo Twisted" . Ahora, ¿qué pasa si quieres algo que sea casi tan eficaz como Twisted pero fácil de escribir webapps convencionales? Saluda al ciclón. Preferiría Ciclón sobre Tornado. Tiene una API que es muy similar a Tornado. De hecho, este es un tenedor de Tornado. Pero el problema es que tiene una comunidad relativamente pequeña. Alexandre Fiori es el único principal responsable del repositorio.

" Pyramid es un marco general de desarrollo de aplicaciones web Python de código abierto. Su objetivo principal es facilitar que un desarrollador de Python cree aplicaciones web". Realmente no he usado Pyramid, pero revisé la documentación. Por lo que entiendo, Pyramid es muy similar a Flask y creo que puedes usar Pyramid donde Flask parece apropiado y viceversa.

EDITAR : ¡La solicitud de revisar cualquier otro marco es bienvenida!

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

dhilipsiva
fuente
1
Django es mi marco preferido. Su documentación es muy buena y el ORM es fácil. South es ideal para migraciones de esquemas de bases de datos ... Pero la pregunta contenía esto: "Me encantaría tener un servidor web asíncrono que me permita escalar fácilmente". Django fue creado para sitios clásicos de solicitud + respuesta, no para asíncrono.
guettli
1
¿Puedes escribir sobre Pyramid?
Fizer Khan
55
@FizerKhan: Según su solicitud, actualicé la respuesta. Lo siento, tomó tanto tiempo. No tuve tiempo de usar Pyramid. Pero revisé la documentación.
dhilipsiva
1
Agregaría que el entorno de un solo subproceso que utiliza Tornado es mucho más propenso a errores: un error que hace que el código para un único punto final de API sea más lento fácilmente causará problemas para todos los puntos finales.
Abel Molina
1
¿Podrías hacer un comentario sobre cherrypy?
Stavros Avramidis
60

Obviamente, esta es una respuesta algo sesgada , pero no es lo mismo que una respuesta incorrecta ; siempre debes usar Twisted. He respondido preguntas similares antes, pero como su pregunta no es la misma, aquí hay algunas razones:

"Mejor actuacion"

Twisted monitorea continuamente nuestro rendimiento en el sitio web speed.twistedmatrix.com . También fuimos uno de los primeros proyectos en ser monitoreados por el sitio similar de PyPy , asegurando así el buen rendimiento de Twisted en el tiempo de ejecución que cualquier persona interesada en aplicaciones de alto rendimiento en Python.

"Escalabilidad"

Que yo sepa, ninguno de los marcos enumerados tiene soporte incorporado para el escalado automático; son todos marcos de comunicación, por lo que debe hacer el trabajo para comunicarse entre sus nodos de escala. Sin embargo, Twisted tiene una ventaja en su soporte integrado para multiprocesamiento local . Para ser justos, hay un complemento de terceros para Tornado que le permite hacer lo mismo. En versiones recientes, Twisted ha agregado características que aumentan la cantidad de formas en que puede compartir el trabajo entre núcleos, y el trabajo está en curso en esa área. Twisted también tiene un par de bien integrados , "nativos" protocolos RPC que ofrecen una construcción de kit para cualquier lenguaje de escala que desea seguir.

"Más útil"

Mucha gente parece encontrar Twisted muy útil . Tanto es así que muchos de ellos lo han extendido y han hecho que sus extensiones estén disponibles para usted.

"Funcionalidad"

Fuera de la caja, Twisted incluye:

En este último departamento, al menos, Twisted parece un claro ganador de la funcionalidad incorporada. ¡Y todo esto, en un paquete de poco más de 2 megabytes!

Glifo
fuente
66
¿Por qué tanta gente dice que ya no usa Twisted, sino GEvent?
remdezx
1
Hay muchas personas que dicen que es difícil mantener grandes aplicaciones usando Twisted (debido a su arquitectura de devolución de llamada): stackoverflow.com/questions/3048012/… ¿No sería mejor usar Twisted basado en gevent o gevent?
Wojciech Danilo
8
@remdezx En cuanto a su pregunta, hay dos razones. Una es que la gente encuentra Twisted difícil de entender porque la programación concurrente es difícil de entender. Luego cambian a GEvent porque es superficialmente fácil de entender, siempre y cuando no haya concurrencia, todo funciona como cabría esperar. La otra razón es que es mucho menos trabajo transferir el código a GEvent que no se escribió utilizando una API basada en eventos para obtener los beneficios de rendimiento de las E / S controladas por eventos. Si su código no comparte demasiado estado, tal puerto probablemente funcione bien.
Glifo
1
@Glyph, estás hablando de concurrencia, pero ... ni Gevent ni Twisted admiten concurrencia (por supuesto, puedes usar multiprocesamiento con gevent y usar un grupo de hilos reales y un grupo de greenlets en cada hilo, lo que funciona bien para mí y puedes usar el plugin Twisted para hacer exactamente lo mismo: ejecuta múltiples inmisiones retorcidas una al lado de la otra). ¿Pero Twisted te da algo más que gentil? Creo que incluso con múltiples instancias de gevent / twisted, gevent es más fácil de entender y sin sus explícitas devoluciones de llamada. ¿Me estoy perdiendo de algo?
Wojciech Danilo
2
@ danilo2 Sí, te falta al menos una cosa :). Específicamente, está malinterpretando la palabra "concurrencia" que significa "ejecución paralela simultánea en múltiples CPU". Twisted puede hacer una programación de E / S concurrente a través de E / S asíncrona (basada en devolución de llamada). GEvent puede hacer una programación simultánea de E / S a través de un planificador de microhilos. En Twisted, usando spawnProcess, esta programación de E / S también se puede traducir a la programación de la CPU.
Glifo
48

Me gusta la respuesta de @Glyph. Twisted es un completo y completo framework de Python. Twisted y Tornado tienen un diseño muy similar. Y me gusta mucho este diseño:

  • es rápido
  • fácil de comprender
  • fácil de extender
  • no requiere extensiones c
  • Funciona en PyPy.

Pero quiero resaltar Tornado , que prefiero y recientemente gané popularidad. Tornado, al igual que Twisted, usa programación de estilo de devolución de llamada, pero se puede incorporar usando tornado.gen.engine( twisted.internet.inlineCallbacksen Twisted).

Codebase

El mejor comentario es del sitio http://cyclone.io . ciclón intenta mezclar Twisted y Tornado porque:

Twisted es una de las bibliotecas más maduras para E / S sin bloqueo disponible para el público. Tornado es la versión de código abierto del servidor web de FriendFeed, uno de los servidores web más populares y rápidos para Python, con una API muy decente para crear aplicaciones web.

La idea es unir la API elegante y directa de Tornado con el bucle de eventos de Twisted, lo que permite una gran cantidad de protocolos compatibles.

Pero en 2011 tornado.platform.twistedsalió, lo que trae una funcionalidad similar.

Actuación

Tornado tiene mucho mejor rendimiento . También funciona a la perfección con PyPy y obtiene una gran ganancia.

Escalabilidad

Lo mismo que Twisted. Tornado tiene tornado.processy muchos servicios de rpc implementados además.

Funcionalidad

Hay 71 paquetes basados ​​en Tornado, en comparación con 148 Twisted's y 48 Gevent's. Pero si observa detenidamente y calcula la mediana del tiempo de carga de los paquetes, verá que los Twisted son los más antiguos, luego Gevent y Tornado los más frescos. Además, hay un tornado.platform.twistedmódulo que le permite ejecutar código escrito para Twisted on Tornado .

Resumen

Con Tornado puedes usar un código de Twisted. No es necesario usar un ciclón que solo tuerce su código (su código se vuelve más desordenado).

En cuanto a 2014, Tornado se considera como un marco asincrónico ampliamente aceptado y predeterminado que funciona tanto en python2 como en python3. Además, la última versión 4.x trae mucha funcionalidad de https://docs.python.org/dev/library/asyncio.html .

Escribí un artículo, explicando por qué considero que Tornado es el mejor marco web de Python donde escribí mucho más sobre la funcionalidad de Tornado.

Robert Zaremba
fuente
15

( ACTUALIZACIÓN : Estoy tristemente sorprendido por las pocas respuestas que aquí recomiendan o incluso mencionan Gevent, ¡no creo que sea en proporción a la popularidad, el rendimiento y la facilidad de uso de esta excelente biblioteca!)

Gevent y Twisted no son mutuamente excluyentes, aunque lo contrario pueda parecer obvio al principio. Hay un proyecto llamado geventreactorque permite aprovechar de manera relativamente fluida lo mejor de ambos mundos, a saber:

  • El modelo de subprocesos eficiente y barato (cooperativo verde) de Gevent, que es mucho más fácil de programar en lo que respecta a la concurrencia; francamente, Twisted's inlineCallbackssimplemente no está a la altura del trabajo en términos de rendimiento cuando se trata de muchas corutinas, y tampoco en términos de facilidad / transparencia de uso: yieldy en Deferredstodas partes; a menudo es difícil construir algunas abstracciones; trazas de pila horriblemente inútiles tanto con Deferreds desnudos como con, y aún más con @inlineCallbacks.
  • Toda la funcionalidad incorporada de Twisted con la que puedes soñar, incluidas, entre otras IReactorProcess.spawnProcess.

Actualmente estoy usando Gevent 1.0rc2 con Twisted 12.3 en puente geventreactor. He implementado mis propias adiciones y mejoras aún no publicadas, geventreactorque publicaré pronto, con suerte como parte del geventreactorrepositorio original de GitHub: https://github.com/jyio/geventreactor .

Mi disposición actual me permite programar en el modelo de programación de GEvent agradable, y las cosas de apalancamiento como un no-bloqueo socket, urllib2y otros módulos. Puedo usar el código Python normal para hacer cosas normales, a diferencia de la curva de aprendizaje y el inconveniente de hacer incluso cosas simples y básicas de la manera Twisted. También puedo usar fácilmente la mayoría de las bibliotecas de terceros que normalmente están fuera de discusión con Twisted o requieren el uso de hilos.

También puedo evitar por completo la programación incómoda y, a menudo, demasiado compleja basada en la devolución de llamada utilizando greenlets (en lugar de Deferredsy devoluciones de llamada, y / o @inlineCallbacks).

(Esta respuesta fue escrita en base a mis experiencias personales al haber usado Twisted y Gevent en proyectos de la vida real, con mucha más experiencia usando Twisted (pero no pretendo ser un experto en Twisted). El software que he tenido que escribir hash No tuve que usar muchas de las características de Twisted, por lo que, dependiendo del conjunto de características que requiera de Twisted, la complejidad adicional (relativamente indolora) de mezclar Gevent y Twisted podría no valer la pena).

Erik Kaplun
fuente