Guía para principiantes de Python Tornado

La web es un lugar grande ahora. Tenemos que soportar miles de clientes a la vez, y aquí viene Tornado. Tornado es un framework web de Python y una librería de red asíncrona, desarrollada originalmente en FriendFreed.

Tornado utiliza una red no bloqueante-io. Debido a esto, puede manejar miles de conexiones de servidor activas. Es una salvación para las aplicaciones donde se mantienen largos sondeos y un gran número de conexiones activas.

Tornado no es como la mayoría de los frameworks de Python. No está basado en WSGI, aunque soporta algunas características de WSGI usando el módulo `tornado.wsgi`. Utiliza un diseño de bucle de eventos que hace que la ejecución de peticiones de Tornado sea más rápida.

¿Qué es un programa síncrono?

Una función se bloquea, realiza su cálculo, y regresa, una vez hecho . Una función puede bloquearse por muchas razones: E/S de red, E/S de disco, mutexes, etc.

El rendimiento de la aplicación depende de la eficiencia con la que la aplicación utiliza los ciclos de la CPU, es por eso que las declaraciones/llamadas de bloqueo deben ser tomadas en serio. Considere las funciones de hashing de contraseñas como bcrypt, que por diseño utilizan cientos de milisegundos de tiempo de CPU, mucho más que un típico acceso a la red o al disco. Como la CPU no está ociosa, no hay necesidad de ir a por funciones asíncronas.

Una función puede ser bloqueante en una, y no bloqueante en otras. En el contexto de Tornado, generalmente consideramos el bloqueo debido a la E/S de la red y el disco, aunque todo tipo de bloqueo debe ser minimizado.

¿Qué es un programa asíncrono?

1) Arquitectura de un solo hilo:

Significa, que no puede realizar tareas centradas en la computación de forma paralela.

2) Concurrencia de E/S:

Puede entregar las tareas de E/S al sistema operativo y continuar con la siguiente tarea para lograr el paralelismo.

3) epoll/ kqueue:

Subraya la construcción relacionada con el sistema que permite a una aplicación obtener eventos en un descriptor de archivo o tareas específicas de E/S.

4) Bucle de eventos:

Utiliza epoll o kqueue para comprobar si se ha producido algún evento, y ejecuta el callback que está a la espera de esos eventos de red.

Marco web asíncrono vs síncrono:

En el caso del modelo síncrono, cada petición o tarea se transfiere a un hilo o ruta, y a medida que termina, el resultado se entrega a la persona que llama. Aquí, la gestión de las cosas son fáciles, pero la creación de nuevos hilos es demasiado overhead.

Por otro lado, en el marco asíncrono, como Node.js, hay un modelo de un solo hilo, por lo que muy menos overhead, pero tiene complejidad.

Imaginemos miles de solicitudes que vienen a través y un servidor utiliza bucle de eventos y devolución de llamada. Ahora, hasta que la solicitud se procesa, tiene que almacenar y gestionar de manera eficiente el estado de esa solicitud para asignar el resultado de la devolución de llamada al cliente real.

Node.js vs Tornado

La mayoría de estos puntos de comparación están vinculados al lenguaje de programación real y no el marco:

  • Node.js tiene la gran ventaja de que todas sus librerías son Async. En Python, hay muchos paquetes disponibles, pero muy pocos son asíncronos
  • Como Node.js es un runtime de JavaScript, y podemos usar JS tanto para el front como para el back-end, los desarrolladores pueden mantener un solo código base y compartir la misma librería de utilidades
  • El motor V8 de Google hace que Node.js sea más rápido que Tornado. Pero muchas bibliotecas de Python están escritas en C y pueden ser alternativas más rápidas.

Un simple ejemplo de ‘Hola Mundo’

CODE: https://gist.github.com/velotiotech/b4d91554b739f2487bf6131ac65ec06d.js

Nota: Este ejemplo no utiliza ninguna función asíncrona.

Usando el módulo AsyncHTTPClient, podemos hacer una llamada REST de forma asíncrona.

CODE: https://gist.github.com/velotiotech/5fe63eb5fd6cf3af9bf353c2fd3b4ca7.js

Como puedes ver `yield http_client.fetch(url)` se ejecutará como una coroutine.

Ejemplo complejo de Tornado Async

Por favor, echa un vistazo a Asynchronous Request handler.

WebSockets Usando Tornado:

Tornado tiene un paquete incorporado para WebSockets que puede ser fácilmente usado con coroutines para lograr concurrencia, aquí hay un ejemplo:

CODE: https://gist.github.com/velotiotech/34d0a0e0ecd57818ae1db1697c075777.js

Se puede utilizar una aplicación cliente WebSocket para conectarse al servidor, el mensaje puede ser cualquier entero. Después de procesar, el cliente recibe el resultado si el entero es primo o no.
Aquí hay un ejemplo más de las características asíncronas reales de Tornado. Muchos lo encontrarán similar al Goroutine y los canales de Golang.

En este ejemplo, podemos iniciar worker(s) y ellos escucharán a la ‘tornado.queue’. Esta cola es asíncrona y muy similar al paquete asyncio.

CODE: https://gist.github.com/velotiotech/1477131948ca23879167df0281726d02.js

Conclusión

1) Los frameworks asíncronos no son muy útiles cuando la mayoría de los cálculos están centrados en la CPU y no en la E/S.

2) Debido a un modelo de un solo hilo por núcleo y un bucle de eventos, puede gestionar miles de conexiones de clientes activos.

3) Muchos dicen que Django es demasiado grande, Flask es demasiado pequeño, y Tornado es justo lo que necesita:)

Deja una respuesta

Tu dirección de correo electrónico no será publicada.