Introducción
La programación concurrente le permite realizar múltiples operaciones simultáneamente, lo que mejora la eficiencia de sus aplicaciones Python, especialmente para tareas con limitaciones de CPU o E/S. En Python, dos enfoques populares para la concurrencia son el módulo de alto nivel concurrent.futures
y el módulo de bajo nivel Multiprocesamiento
. En este artículo, ofrecemos una comparación práctica de estos dos métodos, demostramos su uso con ejemplos y ofrecemos algunas ideas de referencia para ayudarte a elegir la mejor opción para tus necesidades.
Visión general: concurrent.futures
vs. Multiprocesamiento
concurrent.futures
El módulo concurrent.futures
proporciona una interfaz de alto nivel para ejecutar de forma asíncrona funciones ejecutables utilizando subprocesos o procesos. Sus componentes clave son:
- ThreadPoolExecutor
: Para tareas limitadas por la E/S.
- ProcessPoolExecutor
: Para tareas limitadas por la CPU.
Este módulo simplifica el proceso de gestión de la concurrencia con una API coherente.
Multiprocesamiento
El módulo Multiprocesamiento
le permite crear varios procesos, cada uno con su propio intérprete de Python y espacio de memoria. Es ideal para tareas dependientes de la CPU y proporciona un control más preciso sobre la creación y la comunicación de procesos, aunque requiere más código repetitivo que concurrent.futures
.
Ejemplos prácticos
A continuación se muestran ejemplos paralelos que ilustran cómo utilizar ambos módulos para realizar un cálculo sencillo: calcular el cuadrado de los números de una lista.
import concurrent.futures
import time
def square(n):
0.5) # Simular una operación limitada por la CPU
time.sleep(return n * n
if __name__ == "__main__":
= [1, 2, 3, 4, 5]
numbers with concurrent.futures.ProcessPoolExecutor(max_workers=3) as executor:
= list(executor.map(square, numbers))
results print("Results with concurrent.futures:", results)
import Multiprocesamiento
import time
def square(n):
0.5) # Simular una operación limitada por la CPU
time.sleep(return n * n
if __name__ == "__main__":
= [1, 2, 3, 4, 5]
numbers with Multiprocesamiento.Pool(processes=3) as pool:
= pool.map(square, numbers)
results print("Results with Multiprocesamiento:", results)
Información sobre benchmarks
Nota: Los resultados de las pruebas de rendimiento pueden variar en función de la configuración del sistema y la carga de trabajo. En general, para tareas vinculadas a la CPU, tanto ProcessPoolExecutor
como Multiprocesamiento.Pool
funcionan de manera similar. Sin embargo, concurrent.futures
ofrece una API más fácil de usar y una mejor gestión de errores, mientras que Multiprocesamiento
proporciona un control más preciso.
Cuándo utilizar cada enfoque
- Utilice
concurrent.futures
si:- Prefiere una API más sencilla y de alto nivel.
- Si está gestionando tareas vinculadas a E/S con
ThreadPoolExecutor
o tareas vinculadas a la CPU conProcessPoolExecutor
. - Desea soporte integrado para futuros, lo que facilita el manejo de errores y la cancelación.
- Utilice
Multiprocesamiento
si:- Necesitas más control sobre la gestión de procesos y la comunicación entre procesos.
- Tu aplicación depende en gran medida de la CPU y necesitas optimizar el uso de los recursos.
- Te sientes cómodo con más código repetitivo para la gestión de procesos.
Conclusión
Tanto concurrent.futures
como Multiprocesamiento
ofrecen soluciones robustas para la programación concurrente en Python. Su elección depende de los requisitos específicos de sus tareas y de su preferencia por la simplicidad frente al control. Pruebe ambos enfoques para determinar cuál se adapta mejor a su carga de trabajo y considere la posibilidad de utilizar herramientas de evaluación comparativa para medir el rendimiento en su entorno específico.
Lecturas adicionales
- Procesamiento paralelo en Python: acelere su código
- Optimización del código de multiprocesamiento en Python
- Introducción a la programación asíncrona con Asyncio de Python
Feliz programación, y que tus programas concurrentes se ejecuten de manera eficiente!
Explorar más artículos
Aquí hay más artículos de la misma categoría para ayudarte a profundizar en el tema.
Reutilización
Cómo citar
@online{kassambara2024,
author = {Kassambara, Alboukadel},
title = {Programación concurrente: concurrent.futures frente a
Multiprocesamiento},
date = {2024-02-05},
url = {https://www.datanovia.com/es/learn/programming/python/advanced/parallel-processing/concurrent-programming.html},
langid = {es}
}