Python y la piscina de hilos

Siempre he tenido poblemas con la gestión de hilos en Python a la hora de desarrollar aplicaciones multiproceso. Algunos debidos a ciertas particularidades de las librerías gráficas, fácilmente solucionables, y otros dada la naturaleza dinámicamente impredecible de Python (he usado hilos en Java y Mono, y nunca me han parecido tan inestables en este aspecto).

De casualidad navegando por CRySoL, me he topado con una solución genial para Python, que hace transparente la gestión la ejecución multihilo, de una forma mucho más eficiente que andar construyendo y destruyendo diferentes subprocesos para cada hilo paralelo: tener un almacén o piscina de subprocesos que vayan ejecutando las instrucciones de una cola de ejecución.

Parece complicado, pero veréis que no lo es en absoluto.

EDITO 19.19.2010: Podéis descargar la librería desde: https://arco.esi.uclm.es/svn/public/prj/atheist/pyarco/Thread.py

Podéis descargar la librería desde https://arco.esi.uclm.es/svn/public/prj/pyarco/pyarco/threads.py.

Hacemos una prueba sencilla: pidiendo ejecutar dos veces una función con diferentes parámetros, usando dos hilos en el threadpool, y luego uno sólo.

# -*- mode: python; coding: utf-8 -*-

from time import sleep
from threads import ThreadPool

def messages_sleep(msg1,msg2,tm):
print msg1
sleep(tm)
print msg2

print "Ejecución con un ThreadPool de dos hilos"
p = ThreadPool(2)
p.add(messages_sleep,("iniciando hilo 1 (y esperando 6 segundos)","finalizando hilo 1",6))
p.add(messages_sleep,("iniciando hilo 2 (y esperando 8 segundos)","finalizando hilo 2",8))
p.join() # Esperamos a que terminen los hilos para continuar

print "Ejecución con un ThreadPool de un sólo hilo"
p = ThreadPool(1)
p.add(messages_sleep,("iniciando hilo 1 (y esperando 6 segundos)","finalizando hilo 1",6))
p.add(messages_sleep,("iniciando hilo 2 (y esperando 8 segundos)","finalizando hilo 2",8))
p.join() # Esperamos a que terminen los hilos para continuar

Y el resultado será:

Ejecución con un ThreadPool de dos hilos
iniciando hilo 1 (y esperando 6 segundos)
iniciando hilo 2 (y esperando 8 segundos)
finalizando hilo 1
finalizando hilo 2
Ejecución con un ThreadPool de un sólo hilo
iniciando hilo 1 (y esperando 6 segundos)
finalizando hilo 1
iniciando hilo 2 (y esperando 8 segundos)
finalizando hilo 2

Fuente: Patrón ThreadPool en Python en CRySoL.

0 comentarios:

Publicar un comentario en la entrada