Programación concurrente: concurrent.futures frente a Multiprocesamiento

Una comparación práctica para una concurrencia eficiente en Python

Compare el módulo concurrent.futures de alto nivel de Python con el módulo Multiprocesamiento de bajo nivel. Aprenda sus diferencias, vea ejemplos prácticos y revise información sobre benchmarks para elegir el modelo de concurrencia adecuado para sus tareas.

Programación
Autor/a
Afiliación
Fecha de publicación

5 de febrero de 2024

Fecha de modificación

9 de mayo de 2025

Palabras clave

Python concurrent.futures, Multiprocesamiento en Python, Programación concurrente en Python, Comparación de la concurrencia en Python, Limitación de la CPU frente a limitación de la E/S

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):
    time.sleep(0.5)  # Simular una operación limitada por la CPU
    return n * n

if __name__ == "__main__":
    numbers = [1, 2, 3, 4, 5]
    with concurrent.futures.ProcessPoolExecutor(max_workers=3) as executor:
        results = list(executor.map(square, numbers))
    print("Results with concurrent.futures:", results)
import Multiprocesamiento
import time

def square(n):
    time.sleep(0.5)  # Simular una operación limitada por la CPU
    return n * n

if __name__ == "__main__":
    numbers = [1, 2, 3, 4, 5]
    with Multiprocesamiento.Pool(processes=3) as pool:
        results = pool.map(square, numbers)
    print("Results with Multiprocesamiento:", results)

Información sobre benchmarks

Nota

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 con ProcessPoolExecutor.
    • 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

Feliz programación, y que tus programas concurrentes se ejecuten de manera eficiente!

Explorar más artículos

Nota

Aquí hay más artículos de la misma categoría para ayudarte a profundizar en el tema.

placeholder

placeholder
No hay resultados
Volver arriba

Reutilización

Cómo citar

BibTeX
@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}
}
Por favor, cita este trabajo como:
Kassambara, Alboukadel. 2024. “Programación concurrente: concurrent.futures frente a Multiprocesamiento.” February 5, 2024. https://www.datanovia.com/es/learn/programming/python/advanced/parallel-processing/concurrent-programming.html.