python webserver twisted tornado gevent

python - Cuándo usar Tornado, cuándo utilizar Twisted/Cyclone/GEvent/other



webserver (4)

¿Cuál de estos marcos / bibliotecas sería la mejor opción para construir una aplicación web multiusuario moderna? Me encantaría tener un servidor web asíncrono que me permita escalar fácilmente. ¿Qué solución dará 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, streaming, etc.).

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


( ACTUALIZACIÓN : estoy tristemente sorprendido de cómo algunas respuestas aquí recomiendan o incluso mencionan a Gevent, ¡no creo que sea proporcional a la popularidad, el rendimiento y la facilidad de uso de esta excelente biblioteca!)

Gevent y Twisted no son mutuamente excluyentes, aunque al principio pueda parecer obvio. Existe un proyecto llamado geventreactor que permite aprovechar de forma relativamente geventreactor lo mejor de ambos mundos, a saber:

  • El modelo de hilos eficiente y barato (verde cooperativo) de Gevent, que es mucho más fácil de programar cuando se trata de concurrencia: francamente, Twisted''s inlineCallbacks simplemente no está a la altura en términos de rendimiento cuando se trata de muchas corutinas, y tampoco en términos de facilidad / transparencia de uso: yield y Deferreds todas partes; a menudo es difícil construir algunas abstracciones; Huellas horriblemente inútiles de la pila tanto con los desnudos Deferred como, y más aún con @inlineCallbacks .
  • Toda la funcionalidad incorporada de Twisted que puedas soñar, incluyendo, pero sin limitarse a, IReactorProcess.spawnProcess .

Actualmente estoy usando Gevent 1.0rc2 con Twisted 12.3 puenteado por geventreactor . Implementé mis propias adiciones y mejoras inéditas para geventreactor que publicaré próximamente, con suerte como parte del geventreactor original de GitHub de geventreactor : https://github.com/jyio/geventreactor .

Mi diseño actual me permite programar en el agradable modelo de programación de Gevent y aprovechar cosas como un socket no bloqueante, urllib2 y otros módulos. Puedo usar el código de Python regular para hacer cosas normales, a diferencia de la curva de aprendizaje y la inconveniencia 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 cuestión con Twisted o requieren el uso de subprocesos.

También puedo evitar completamente la programación incómoda y, a menudo, demasiado compleja basada en la devolución de llamadas mediante el uso de comodines (en lugar de llamadas Deferred y devoluciones de llamada, y / o @inlineCallbacks ).

(Esta respuesta fue escrita en base a mis experiencias personales al haber usado tanto Twisted como Gevent en proyectos de la vida real, con mucha más experiencia en el uso de Twisted (pero no pretendo ser un experto en Twisted). El software que he tenido que escribir hasn Tuvo que usar demasiadas funciones de Twisted, por lo que dependiendo del conjunto de características que requiera de Twisted, la complejidad extra (relativamente indolora) de mezclar Gevent y Twisted podría no valer la pena).


Me gusta la respuesta @Glyph. Twisted es un framework python muy completo y rico. 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 c-extensiones
  • trabaja en PyPy.

Pero quiero resaltar Tornado , que prefiero y que recientemente ganó popularidad. Tornado, al igual que Twisted, utiliza la programación de estilo de devolución de llamada, pero puede ser inline utilizando tornado.gen.engine ( twisted.internet.inlineCallbacks in Twisted).

Base de código

El mejor comentario es del sitio Cyclone . cyclone 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 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 a Event-Loop de Twisted, permitiendo una gran cantidad de protocolos compatibles.

Pero en 2011, tornado.platform.twisted fue tornado.platform.twisted y ofrece una funcionalidad similar.

Actuación

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

Escalabilidad

Lo mismo que Twisted. Tornado tiene tornado.process y una gran cantidad de servicios rpc implementados en la parte superior.

Funcionalidad

Hay 71 paquetes basados ​​en Tornado, en comparación con 148 Twisted y 48 Gevent. Pero si observa cuidadosamente y calcula la mediana del tiempo de carga de paquetes, verá que los Twisted son los más antiguos, y luego los Gevent y Tornado los más frescos. Además, hay tornado.platform.twisted módulo tornado.platform.twisted que le permite ejecutar el 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 el código (el código se vuelve más complicado).

En cuanto a 2014, Tornado se considera como el marco asíncrono predeterminado y ampliamente aceptado que funciona tanto en python2 como en python3. Además, la última versión 4.x ofrece una gran cantidad de funcionalidades desde https://docs.python.org/dev/library/asyncio.html .

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


Obviamente, esta es una respuesta un tanto parcial , pero eso no es lo mismo que una respuesta wrong ; siempre debes usar Twisted. He respondido preguntas similares anteriormente, pero como su pregunta no es la misma, aquí hay algunas razones:

"Mejor presentación"

Twisted monitorea continuamente nuestro desempeño en el sitio web speed.twistedmatrix.com . También fuimos uno de los primeros proyectos supervisados ​​por el sitio similar de PyPy , lo que garantiza el buen rendimiento de Twisted en el tiempo de ejecución de cualquier persona involucrada con aplicaciones de alto rendimiento en Python.

"Escalabilidad"

Que yo sepa, ninguno de los marcos enumerados tiene ningún soporte integrado para la escala automática; todos son marcos de comunicación, por lo que debe hacer el trabajo de 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 te permite hacer lo mismo. En versiones recientes, Twisted ha agregado características que aumentan la cantidad de formas en que puede compartir trabajo entre núcleos, y el trabajo continúa en esa área. Twisted también tiene un par de protocolos RPC "native" bien integrados que ofrecen un kit de construcción para cualquier idioma de escala que desee.

"Más útil"

Parece que mucha gente cree que Twisted es muy útil . Tanto es así que muchos de ellos lo han extendido y han puesto sus extensiones a su disposición.

"Funcionalidad"

Fuera de la caja, Twisted incluye:

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


" Django es un framework Web de Python de alto nivel que fomenta un desarrollo rápido y un 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á tu 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 estructuras tu aplicación, lo cual es bueno si me preguntas. Y tiene la comunidad más fuerte de todas las otras bibliotecas, lo que significa que hay disponible ayuda fácil.

" 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 es una biblioteca a medio cocer. Esto significa que el núcleo del matraz es muy, muy simple. A diferencia de Django, no tomará ninguna decisión sobre tecnología para ti. Usted es libre de elegir cualquier motor de plantilla o ORM que le agrade. Aunque viene con el motor de plantillas de Jinja de forma predeterminada, siempre puedes elegir el nuestro. Por lo que sé, Flask es útil para escribir puntos finales API (servicios RESTful).

" Twisted es un motor de red basado en eventos escrito en python" . Este es un motor de alto rendimiento. La razón principal de su velocidad es algo llamado como diferido. Twisted está construido encima de diferidos. Para aquellos de ustedes que no saben acerca de los puntos débiles, es el mecanismo a través del cual se logra la arquitectura asíncrona. 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 framework web Python y una biblioteca de redes asíncrona, 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 largas encuestas, WebSockets y otras aplicaciones que requieren una conexión de larga duración para 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 muy bien el problema C10k si está bien estructurado.

" Cyclone es un marco de servidor web para Python que implementa Tornado API como un protocolo Twisted" . Ahora, ¿qué pasa si quieres algo que es casi tan eficiente 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. Como cuestión de hecho, este es un tenedor de Tornado. Pero el problema es que tiene una comunidad relativamente pequeña. Alexandre Fiori es el único responsable principal del repositorio.

" Pyramid es un framework de desarrollo de aplicaciones web Python general y de código abierto. Su objetivo principal es facilitar a los desarrolladores de Python la creación de 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 el Flask parezca apropiado y viceversa.

EDIT : ¡se agradece la solicitud para revisar cualquier otro marco!

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