Pool de hilos
En Python, puedes usar un pool de hilos para ejecutar tareas concurrentemente utilizando un conjunto predefinido de hilos. La ventaja de usar un pool de hilos es que evita la sobrecarga de crear y destruir hilos para cada tarea, lo que puede mejorar el rendimiento.
El módulo concurrent.futures
de Python proporciona una clase ThreadPoolExecutor
que te permite crear un pool de hilos y enviar tareas. Aquí hay un ejemplo:
Crea un proyecto llamado thread_pool_range.py
en el WebIDE y escribe el siguiente contenido.
import concurrent.futures
## Define una función que se ejecutará en múltiples hilos con dos argumentos
def my_func(arg1, arg2):
## Define las tareas realizadas por el hilo aquí
print(f"Hello from my thread with args {arg1} and {arg2}")
## Crea un objeto ThreadPoolExecutor con un máximo de 5 hilos trabajadores
with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
## Envía cada tarea (llamada a función con sus argumentos) al ejecutor para su procesamiento en un hilo separado
## El método submit() devuelve un objeto Future que representa el resultado de la computación asíncrona
for i in range(10):
executor.submit(my_func, i, i+1)
En este ejemplo, definimos una función my_func
que toma dos argumentos. Creamos un ThreadPoolExecutor
con un máximo de 5 hilos trabajadores. Luego, recorremos un rango de números y enviamos tareas al pool de hilos usando el método executor.submit()
. Cada tarea enviada se ejecuta en uno de los hilos trabajadores disponibles.
Consejos: El objeto ThreadPoolExecutor
se utiliza como administrador de contexto. Esto garantiza que todos los hilos se limpien correctamente cuando se completa el código dentro del bloque with
.
Utiliza el siguiente comando para ejecutar el script.
python thread_pool_range.py
El método submit()
devuelve inmediatamente un objeto Future, que representa el resultado de la tarea enviada. Puedes usar el método result()
del objeto Future para recuperar el valor de retorno de la tarea. Si la tarea lanza una excepción, llamar a result()
lanzará esa excepción.
También puedes usar el método map()
de la clase ThreadPoolExecutor
para aplicar la misma función a una colección de elementos. Por ejemplo, crea un proyecto llamado thread_pool_map.py
en el WebIDE y escribe el siguiente contenido.:
import concurrent.futures
## Define una función que se ejecutará en múltiples hilos
def my_func(item):
## Define las tareas realizadas por el hilo aquí
print(f"Hello from my thread with arg {item}")
## Crea una lista de elementos que serán procesados por los hilos
items = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
## Crea un objeto ThreadPoolExecutor con un máximo de 5 hilos trabajadores
with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
## Envía cada elemento al ejecutor para su procesamiento en un hilo separado
## El método map() devuelve automáticamente los resultados en orden
executor.map(my_func, items)
En este ejemplo, definimos una función my_func
que toma un argumento. Creamos una lista de elementos y los enviamos al pool de hilos usando el método executor.map()
. Cada elemento de la lista se pasa a my_func
como un argumento, y cada elemento se ejecuta en uno de los hilos trabajadores disponibles.
Utiliza el siguiente comando para ejecutar el script.
python thread_pool_map.py
Los resultados obtenidos de thread_pool_range.py
y thread_pool_map.py
son los mismos.