2010-05-29 7 views
26

No entiendo qué problema resuelven estos marcos. ¿Son reemplazos para un servidor HTTP como Apache HTTPD, Tomcat, Mongrel, etc.? ¿O son más? ¿Por qué los usaría ... algunos ejemplos del mundo real? He visto un sinfín de ejemplos de salas de chat y servicios de transmisión, pero no veo cómo esto es diferente de, por ejemplo, la configuración de un programa Java para abrir sockets y enviar un hilo para cada solicitud.¿Cuál es el punto/propósito de Ruby EventMachine, Python Twisted o JavaScript Node.js?

Creo que entiendo las E/S no bloqueantes, pero no entiendo cómo eso es diferente de un servidor web de subprocesos múltiples. Para Node.js, leí que solo tiene un hilo y que esto puede ser más eficiente que hacer malabares con varios hilos, pero ¿es eso la única diferencia entre estos marcos y un servidor web tradicional?

Respuesta

4

Sin pila por conexión. Solo una pila por núcleo de procesador. No es que en realidad pueda hacer más de una cosa a la vez: ¿por qué no esperar a que algo esté ocupado para cambiar de tarea, en lugar de avanzar y retroceder arbitrariamente?

+0

Compro que esperar otras cosas lleva mucho tiempo, pero ¿qué pasa con una situación en la que una página en particular tiene un montón de procesamiento y tarda ~ 500ms en completarse? Eso significa que cualquier otra solicitud entre su inicio y su final tendrá que esperar hasta 1/2 segundo antes de que comience. Estoy pensando en un script que hace un gran número de cálculos sobre cosas que no se pueden recuperar de una manera ya compilada, es decir, mucha CPU, poca E/S. – CCw

+3

@CCw: No, no lo haría, al menos con el nodo.js configura un evento para ese proceso y recibe una devolución de llamada cuando está listo (en palabras cortas), mientras que el resto del script sigue funcionando en las solicitudes de publicación y publicación. Lo que estás describiendo es lo opuesto, el método de "sincronización". – stagas

+1

De hecho, algo que hace 500ms de cálculo por página va a necesitar muchas CPU para obtener concurrencia, o debería cortarse como una tarea en segundo plano, con un evento para su finalización. La mayoría de los sistemas web se resisten a la ejecución de muchos de estos tipos de cosas: tantas pilas colgando, hilos intercambiables y nadie hace demasiado. La programación asíncrona obliga a uno a aislar los bits de código que se comportan mal, y piensa en el sistema como un todo. – aredridel

6

De hecho, los marcos basados ​​en eventos son adecuados para situaciones en las que tiene mucho io y menos operaciones de CPU, pero eso define la mayoría de las páginas web, porque esperan db. Otros ejemplos son chats o videos como youtube: una pila permite atender a más clientes al mismo tiempo. Los servidores basados ​​en eventos son capaces de manejar decenas o cientos de miles de clientes conectados, donde tal cantidad de hilos mataría a la máquina. Son menos eficientes cuando realmente tienes algo de procesamiento que hacer.

19

Puede utilizar uno de estos marcos si desea escribir código que hace redes.

Por ejemplo, si fuera a escribir a massively multiplayer video game, "configurar un programa Java ... para enviar un hilo para cada solicitud" probablemente no sea una opción; Hacer malabarismos con muchos hilos es fenomenalmente complejo y tiene un rendimiento pobre también. Sin mencionar el hecho de que "solo engendrar un montón de hilos" falta un montón de herramientas de gestión que Twisted et. Alabama. tener, como twistd, que maneja el registro, daemonización, inicio y apagado, y así sucesivamente.

O si desea escribir un build automation system, la capacidad de asynchronously invoke and control subprocesses sería útil. Si genera un proceso de forma asincrónica, puede eliminar fácilmente ese proceso y tratar con gracia su salida. Si lo genera comenzando un hilo y bloqueando ese hilo, no puede detenerlo fácilmente, ya que stopping a thread is inherently unsafe.

EventMachine y Twisted se pueden usar para escribir programas del lado del cliente también; tal vez está escribiendo una aplicación de GUI que no está basada en la web, y desea utilizar la misma implementación de protocolo en el cliente y el servidor.

Dado que puede utilizar marcos asíncronos en muchos contextos diferentes, es posible que desee utilizarlo en una aplicación web simplemente porque tiene un código de biblioteca existente, escrito para alguna otra aplicación utilizando su marco asíncrono, que desea usar. O tal vez desee volver a utilizar el código de su aplicación web en alguna aplicación hipotética futura que no sea web. En este caso, no es muy diferente a usar Apache o Tomcat o lo que sea en términos de funcionalidad, solo le brinda una forma más general y reutilizable de organizar su programa.

Cuestiones relacionadas