Concurrencia y Paralelismo

En aplicaciones que requieren ejecutar múltiples tareas simultáneamente, la concurrencia y el paralelismo permiten mejorar el rendimiento.

Conceptos clave

  • threading: Hilos de ejecución.

  • multiprocessing: Procesos independientes.

  • asyncio y async/await: Manejo de tareas asincrónicas.

Ejemplo

import threading

def tarea():
    print("Tarea ejecutada por hilo")

# Crear un hilo
hilo = threading.Thread(target=tarea)
hilo.start()
hilo.join()

Ejemplo Práctico

Objetivo:

Aprender a utilizar técnicas de concurrencia y paralelismo para ejecutar tareas de manera simultánea y mejorar el rendimiento de las aplicaciones.

Descripción:

En este ejemplo se utilizan tres enfoques diferentes de concurrencia: threading, multiprocessing y asyncio. Cada uno es útil en diferentes escenarios según la naturaleza de la tarea que se quiere realizar.

Instrucciones:

  • Crea una función simple que imprima un mensaje.

  • Implementa la ejecución concurrente de esa función utilizando threading, multiprocessing y asyncio.

Ejemplos prácticos:

1. Uso de threading:

El módulo threading permite ejecutar funciones de forma concurrente en múltiples hilos dentro de un solo proceso.

import threading

def tarea():
    print("Tarea ejecutada por hilo")

# Crear un hilo
hilo = threading.Thread(target=tarea)
hilo.start()
hilo.join()  # Esperar a que termine la ejecución del hilo
print("Hilo terminado")

2. Uso de multiprocessing:

El módulo multiprocessing permite ejecutar funciones en múltiples procesos independientes, lo que es útil para tareas que consumen mucho CPU.

import multiprocessing

def tarea():
    print("Tarea ejecutada por proceso")

# Crear un proceso
proceso = multiprocessing.Process(target=tarea)
proceso.start()
proceso.join()  # Esperar a que termine la ejecución del proceso
print("Proceso terminado")

3. Uso de asyncio y async/await:

El módulo asyncio permite manejar operaciones de entrada/salida asincrónicas de manera eficiente, sin bloquear el hilo principal.

import asyncio

async def tarea():
    print("Tarea asincrónica ejecutada")
    await asyncio.sleep(2)  # Simula una tarea asincrónica con espera
    print("Tarea asincrónica terminada")

# Ejecutar tareas asincrónicas
async def main():
    await asyncio.gather(tarea(), tarea())

asyncio.run(main())  # Ejecuta el bucle de eventos