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.
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:
- Tornado recibe solicite y llame al método de controlador apropiado en su aplicación
- Su método de controlador realiza una llamada a base de datos asíncrona, con una devolución de llamada
- 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.
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
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. –