python twisted celery tornado gevent

python - Tornado/Twisted-Apio-Comparación Gevent



celery (1)

Me cuesta un poco entender las diferencias entre estos tres marcos:

Estos tres marcos pueden usarse para ejecutar código al mismo tiempo, pero hacerlo de manera diferente utilizando una cantidad diferente de subprocesos / procesos o estilo de código. Así es como estoy entendiendo las diferencias en este momento:

  • Tornado / Twisted utiliza código asíncrono controlado por un bucle de E / S. Esto permite que el código se ejecute en un solo subproceso (varios subprocesos son inútiles porque si no tiene código de bloqueo, esto no es necesario)
  • Celery utiliza un sistema basado en tareas para ejecutar el código de forma asíncrona, el código en sí mismo sigue siendo síncrono. Existe un proceso principal que es capaz de distribuir las diferentes tareas entre otros trabajadores en diferentes procesos.
  • Gevent utiliza un sistema basado en subprocesos y genera un subproceso para procesar diferentes conexiones entrantes.

Las preguntas que tengo ahora son:

  1. ¿Mi comprensión de estos marcos es correcta?
  2. La principal diferencia entre un subproceso y un proceso es que los diferentes subprocesos usan la misma memoria, mientras que los procesos no. ¿Normalmente se ejecuta un proceso en un servidor central? (Y por lo tanto, hace que el apio sea difícil de implementar en un servidor pequeño)
  3. Si estamos hablando de aplicaciones web y sockets :

Tornado / Twisted Son capaces de aceptar (casi) cualquier cantidad de sockets porque usan código asíncrono y ponen en cola la solicitud en el bucle de E / S.

¿ Son capaces de esto el apio / Gevent ? ¿Tienen que generar un nuevo proceso / subproceso para poder aceptar un nuevo socket?

Estoy tratando de averiguar cuál de estas tecnologías es la más adecuada para construir una aplicación web en tiempo real.


  1. Gevent usa greenlets lugar de subprocesos en un bucle de IO implícitamente, por lo que no hay un ciclo de reactor / IO para iniciar manualmente en el caso de Twtisted / Tornado. También tiene la capacidad de parchear las bibliotecas existentes para respaldar su operación programada, Tornado y Twisted requieren bibliotecas específicas para trabajar con sus bucles de eventos, aunque encontrará muchas ya existentes.

    El apio se hace mucho más para que el procesamiento en segundo plano descargue costosos cálculos a otro proceso / servidor.

  2. Los procesos pueden compartir memoria, pero no de la misma manera que lo hacen los hilos. Los subprocesos en CPython sufren de la GIL y, en general, vale la pena no usar una solución de subprocesos si está haciendo algo con un uso intensivo de la CPU.

    No estoy seguro de los requisitos de memoria de Celery, pero si está utilizando 1 proceso web y 1 proceso en segundo plano, debería estar bien incluso con un VPS de 256 MB, aunque más es mejor si admite muchas conexiones.

  3. La cantidad de sockets que se pueden manejar con Tornado / Twisted / Gevent probablemente estará delimitada por la cantidad y la frecuencia de IO realizadas por socket. Los sockets de baja frecuencia / bajo ancho de banda son mucho más fáciles de soportar un gran número de conexiones concurrentes, ya que en su mayoría estarán inactivas.

    Celery aún requerirá alguna aplicación para escuchar sockets y hacer llamadas para ser procesadas con el demonio Celery. También es compatible con Gevent, por lo que puede manejar múltiples tareas simultáneamente si es necesario.