2012-05-11 14 views
5

Mi pregunta es de dos partes:Tornado y el manejo de peticiones asíncronas

  1. ¿Qué quiere decir exactamente por un 'servidor asíncrono', que es por lo general lo que se llama Tornado? ¿Puede alguien proporcionar un ejemplo concreto para ilustrar el concepto/definición?

  2. En el caso de Tornado, ¿qué significa exactamente con "no bloqueo"? ¿Está esto relacionado con la naturaleza asincrónica anterior? Además, lo leí en alguna parte, siempre usa un solo hilo para manejar todas las solicitudes, ¿esto significa que las solicitudes se manejan secuencialmente una por una o en paralelo? Si es el último caso, ¿cómo lo hace Tornado?

Respuesta

10
  1. Tornado utiliza asynchronous, non-blocking I/O para resolver the C10K problem. Eso significa que todas las operaciones de E/S son impulsadas por eventos, es decir, usan devoluciones de llamada y notificación de eventos en lugar de esperar que la operación regrese. Node.js y Nginx usan un modelo similar. La excepción es tornado.database, que está bloqueando. El Tornado IOLoop source está bien documentado si desea ver en detalle. Para un ejemplo concreto, ver a continuación.

  2. No bloqueante y asíncrono se usan indistintamente en Tornado, aunque en otros casos existen diferencias; this answer gives an excellent overview. Tornado usa un hilo y maneja las solicitudes secuencialmente, aunque muy rápidamente, ya que no hay que esperar a IO. En producción, normalmente ejecuta múltiples procesos Tornado.

En cuanto a un ejemplo concreto, supongamos que tiene una petición HTTP, que Tornado debe obtener algunos datos (de forma asíncrona) y responder a, aquí está (muy aproximadamente) lo que sucede:

  1. Tornado recibe solicite y llame al método de controlador apropiado en su aplicación
  2. Su método de controlador realiza una llamada a base de datos asíncrona, con una devolución de llamada
  3. Devuelve la llamada de base de datos, se llama y se envía una respuesta.

Lo que es diferente de Tornado (frente a Django por ejemplo) es que entre los pasos 2 y 3 el proceso puede continuar manejando otras solicitudes. Tornado IOLoop simplemente mantiene la conexión abierta y continúa procesando su cola de devolución de llamada, mientras que con Django (y cualquier marco web síncrono) el hilo se bloqueará, esperando que la base de datos regrese.

+0

Bien escrito respuesta. Cuando dices 'notificación de evento', ¿te refieres a los eventos generados para indicar la finalización de las operaciones de E/S para que se llamen las devoluciones de llamada? ¿Hay algún otro tipo de eventos? ¡Gracias! – skyork

+0

Sí, quiero decir que a Tornado se le notifican los datos entrantes a través de epoll o kqueue, es decir, notificación de cambio impulsado por el borde. –