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
= threading.Thread(target=tarea)
hilo
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
= threading.Thread(target=tarea)
hilo
hilo.start()# Esperar a que termine la ejecución del hilo
hilo.join() 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
= multiprocessing.Process(target=tarea)
proceso
proceso.start()# Esperar a que termine la ejecución del proceso
proceso.join() 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())
# Ejecuta el bucle de eventos asyncio.run(main())