Cargando



Python - Procesos Asíncronos

En este tutorial estaremos viendo un poco los conceptos básicos y algunos ejemplos de programas que utilizan la forma asíncrona para trabajar con las peticiones.


dic 09 2013 15:35
Profesional
dic 11 2013 10:21
En el momento en que ingresamos al mundo de procesamiento múltiple, de los servidores y las peticiones variadas, debemos saber que existen varios tipos de respuestas o comportamientos, el sincrónico y el asíncrono.

El primero consiste en servir una petición atendiendo a una teoría de colas, fifo, lifo etc. Es decir hasta que no finalice el proceso no pasa a otro, viendo este comportamiento, no sería problema para un programa que maneje Threads ya que podría generar varios Threads por cada petición que sirvan funciones específicas.

Luego tenemos el asíncrono que nos sirve para atender con un mismo Thread varias peticiones dependiendo de su estado, de forma que si se ejecutan varias peticiones mientras una procesa algo podemos ir atendiendo la siguiente o tal vez no debemos ni siquiera esperar por un petición para enviar un dato al cliente:

python_proc_asinc.jpg


Como vemos en la imagen, se hace una simulación de funcionamiento de un chat donde se va revisando hasta que existe un mensaje que transmitir.

Procesos de Entrada y Salida asíncronos

Cuando hacemos una lectura asíncrona de las peticiones del cliente, no es necesario que hagamos la lectura completa del mensaje inicialmente, si no que podemos ir viendo poco a poco, gracias a la velocidad de procesamiento.

Para el trabajo asíncrono en Python contamos con dos funciones que nos pueden ayudar, una es select y la otra es poll, de las cuales esta última solo está disponible para entornos UNIX, por lo que pudiera ser una condición que pongamos un límite si queremos hacer un programa multiplataforma, sin embargo es la solución que mejor escala, así que debemos tener en cuenta estos detalles.

La función select toma 3 secuencias como argumentos obligatorios, con un cuarto argumento que es opcional y que contiene el timeout en segundos, las secuencias son conexiones por las cuales vamos a esperar, al ser 3 corresponden con los siguiente: entrada, salida, condiciones excepcionales(errores, excepciones, etc).

Si no especificamos un timeout, la función select esperará hasta que una de las secuencias esté lista para la acción, de lo contrario si especificamos un timeout, los bloques esperaran por el tiempo correspondiente. Los valores que retorna la función representan un subconjunto activo de cada secuencia, por ejemplo la primera secuencia retornada será una secuencia de entrada donde tendremos algo que leer.

Veamos el siguiente código de ejemplo de cómo implementar un servidor utilizando la función select:

import socket, select
s = socket.socket()
host = socket.gethostname()
port = 1234
s.bind((host, port))
s.listen(5)
inputs = [s]
while True:
[b] rs, ws, es = select.select(inputs, [], [])[/b]
for r in rs:
	 if r is s:
		 c, addr = s.accept()
		 print 'Got connection from', addr
		 inputs.append(c)
	 else:
		 try:
			 data = r.recv(1024)
			 disconnected = not data
			 except socket.error:
			 disconnected = True
		 if disconnected:
			 print r.getpeername(), 'disconnected'
			 inputs.remove(r)
		 else:
			 print data

Como podemos observar, cuando llamamos a la función select pasando las 3 secuencias obligatorias, le pasamos la variable inputs, que está unida a lo que el servidor capta estando a la escucha por el puerto 1234 del TCP, luego iteramos para mostrar la información.

Como vemos este aspecto de la implementación es bastante sencillo y el límite se lo dará nuestra creatividad a la hora de realizar el programa.

¿Te ayudó este Tutorial?


Sin comentarios, sé el primero!

No esperes más y entra en Solvetic
Deja tus comentarios y aprovecha las ventajas de la cuenta de usuario ¡Únete!

X