Threads en Python

Hace unos días, necesité utilizar threading en Python en el trabajo. Como sabéis, soy programador web. Necesitaba ejecutar un programa que suele tardar entre 1 y 4 minutos y tenía que ejecutarse como resultado de una petición web. Evidentemente, no puedo tardar en responder una petición todo ese tiempo, así que lo hice creando un subproceso.

Vamos a utilizar la clase Thread del módulo threading. Lo único que tenemos que hacer es pasarle como parámetros la función que queremos ejecutar y los parámetros con los que queremos ejecutarla. A continuación, basta con start el hilo y usar los métodos que puedan ser necesarios, por ejemplo join o isAlive.

Vamos a hacer un ejemplo muy básico:

from threading import Thread
from time import sleep

def espera(n):
 sleep(n)
 print "Espero %s segundos." % n


subproceso = Thread(target=espera, args=(5,))

subproceso.start()

print "Yo espero menos."
subproceso.join()
print "Yo llego tarde."

El código es muy sencillo. La función espera espera n segundos y luego pone en pantalla un mensaje. El resto del programa crea la hebra subproceso y luego la inicia con subproceso.start. A continuación, ya con subproceso ejecutándose imprimimos Yo espero menos.. La llamada subproceso.join detendrá el programa hasta que la hebra haya finalizado. Entonces, y sólo entonces, se imprimirá en pantalla el mensaje Yo llego tarde.

El método join sólo tenemos que ejecutarlo si queremos sincronizar el proceso principal y el nuevo subproceso. En caso contrario, simplemente tendremos 2 procesos ejecutándose a la vez.

Ahora un ejemplo de uso de isAlive:

from threading import Thread
from time import sleep
from random import choice

def espera(n):
 sleep(n)

subproceso = Thread(target=espera, args=(5,))

subproceso.start()

while(subproceso.isAlive()):
 print "Esperando..."
 sleep(1)

print "He llegado."

isAlive nos dice si el subproceso continúa ejecutándose o ya ha acabado. En este caso, mientras el proceso esté ejecutándose, imprimiremos una y otra vez el mensaje Esperando.... Sencillo, ¿no?

Lo dejo por hoy. Hay mucho más que contar sobre threads en Python así que posiblemente escriba más sobre el tema en las próximas semanas. ¡Saludos!