Multiprocesamiento frente a multihilos en Python

Elegir el modelo de concurrencia adecuado para sus tareas

Compara el multiprocesamiento y el multithreading en Python. Comprenda sus diferencias, ventajas y casos de uso, y aprenda cuándo aplicar cada enfoque para tareas vinculadas a la CPU y a la E/S.

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

Multiprocesamiento frente a multihilos, Concurrencia en Python, Limitación de la CPU frente a limitación de la E/S, Multiprocesamiento en Python, Multihilos en Python

Introducción

Python ofrece dos modelos principales para la programación concurrente: multiprocessing y multithreading. Ambos enfoques permiten ejecutar varias tareas simultáneamente, pero funcionan de manera muy diferente y son adecuados para distintos tipos de cargas de trabajo. En este tutorial, comparamos estos dos modelos, analizamos sus ventajas y limitaciones, y ofrecemos orientación sobre cuándo utilizar cada uno, especialmente en el contexto de tareas limitadas por la CPU frente a tareas limitadas por la E/S.



Definiciones

Multiprocesamiento

  • Concepto:
    El multiprocesamiento implica la ejecución de varios procesos, cada uno con su propio intérprete de Python y espacio de memoria. Esto permite un verdadero paralelismo en sistemas multinúcleo.

  • Ideal para:
    Tareas dependientes de la CPU, en las que se pueden distribuir cálculos pesados entre varios procesos.

  • Módulo clave:
    Módulo multiprocessing de Python.

Multihilos

  • Concepto:
    El multithreading utiliza varios subprocesos dentro de un solo proceso. Los subprocesos comparten el mismo espacio de memoria, lo que facilita la comunicación, pero también introduce retos como las condiciones de carrera.

  • Ideal para:
    Tareas vinculadas a E/S (por ejemplo, operaciones de red, E/S de archivos) en las que el programa pasa gran parte de su tiempo esperando eventos externos.

  • Consideraciones clave:
    Debido al bloqueo global del intérprete (GIL) de Python, es posible que el multithreading no suponga una mejora del rendimiento en tareas limitadas por la CPU.

Consideraciones sobre el rendimiento

  • Tareas vinculadas a la CPU:
    La multiprocesación suele ser más eficaz para tareas que dependen de la CPU, ya que permite que se ejecuten varios procesos en paralelo en diferentes núcleos de la CPU, sin pasar por el GIL.

  • Tareas vinculadas a la E/S:
    El multithreading puede ser beneficioso para tareas con limitaciones de E/S, ya que los subprocesos se pueden cambiar mientras se espera a que se completen las operaciones de E/S, lo que mejora la capacidad de respuesta general.

Ejemplo comparativo

A continuación se muestra un ejemplo ilustrativo que compara un caso de uso sencillo con multiprocesamiento frente a multithreading. (Nota: para abreviar, aquí solo se proporciona el código Python)

import multiprocessing
import time

def compute_square(n):
    time.sleep(1)  # Simular una tarea limitada por la CPU
    return n * n

if __name__ == "__main__":
    numbers = [1, 2, 3, 4, 5]
    with multiprocessing.Pool(processes=3) as pool:
        results = pool.map(compute_square, numbers)
    print("Multiprocesamiento results:", results)
import threading
import time

def compute_square(n, results, index):
    time.sleep(1)  # Simular una tarea limitada por E/S
    results[index] = n * n

if __name__ == "__main__":
    numbers = [1, 2, 3, 4, 5]
    results = [None] * len(numbers)
    threads = []
    for idx, num in enumerate(numbers):
        thread = threading.Thread(target=compute_square, args=(num, results, idx))
        threads.append(thread)
        thread.start()

    for thread in threads:
        thread.join()

    print("Multihilos results:", results)
Nota

Nota: En el ejemplo de multiprocesamiento, las tareas se distribuyen entre procesos separados para el trabajo que requiere un uso intensivo de la CPU. Por el contrario, el ejemplo de subprocesamiento es más adecuado para tareas vinculadas a E/S, en las que la espera (simulada por time.sleep()) permite que se ejecuten otros subprocesos.

Cuándo utilizar cada uno

  • Utilice el multiprocesamiento cuando:
    • Sus tareas están limitadas por la CPU.
    • Necesitas aprovechar varios núcleos de CPU para la ejecución paralela.
    • Puedes tolerar la sobrecarga de la creación de procesos y la comunicación entre procesos.
  • Utilice la multithreading cuando:
    • Sus tareas están limitadas por la E/S.
    • Necesita realizar muchas operaciones simultáneamente que implican espera (por ejemplo, llamadas de red).
    • Necesitas concurrencia ligera con acceso a memoria compartida.

Conclusión

La elección entre multiprocesamiento y multithreading depende de la naturaleza de sus tareas. Para operaciones que dependen de la CPU, el multiprocesamiento puede acelerar significativamente sus programas al aprovechar varios núcleos. Para tareas limitadas por E/S, el multithreading ofrece una solución ligera para mejorar la capacidad de respuesta. Comprender las ventajas y limitaciones de cada modelo le ayudará a diseñar aplicaciones Python más eficientes y escalables.

Lecturas adicionales

Feliz programación, y que tus programas Python se ejecuten de forma eficiente y concurrente!

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 = {Multiprocesamiento frente a multihilos en Python},
  date = {2024-02-05},
  url = {https://www.datanovia.com/es/learn/programming/python/advanced/parallel-processing/multiprocessing-vs-threading.html},
  langid = {es}
}
Por favor, cita este trabajo como:
Kassambara, Alboukadel. 2024. “Multiprocesamiento frente a multihilos en Python.” February 5, 2024. https://www.datanovia.com/es/learn/programming/python/advanced/parallel-processing/multiprocessing-vs-threading.html.