Concurrencia

Tabla de contenidos

Resumir con:

La concurrencia se refiere a la capacidad de un sistema para ejecutar múltiples tareas simultáneamente. Por lo que la concurrencia es una característica esencial que permite a los desarrolladores crear aplicaciones que pueden realizar varias operaciones al mismo tiempo, mejorando así el rendimiento y la eficiencia del software. 

La concurrencia se puede lograr mediante el uso de varios hilos de ejecución o threads, que son unidades independientes de procesamiento que pueden ejecutar tareas de manera concurrente. Los lenguajes de programación proporcionan varias formas de trabajar con hilos, lo que permite a los desarrolladores implementar la concurrencia de manera eficaz en sus aplicaciones. 

Ejemplo de concurrencia e hilos

Una de las formas más comunes de trabajar con concurrencia utilizando de ejemplo Python es utilizando la clase Thread o implementando la interfaz Runnable. Por ejemplo, se puede crear una clase que extienda la clase Thread y sobrescribir el método run() para definir la tarea que se ejecutará en un hilo separado. Ejemplo básico: 

import threading 

 

# Definir una función que será ejecutada por un hilo 

def tarea(): 

    print(«Hola desde el hilo») 

 

# Crear un hilo y ejecutar la función tarea 

hilo = threading.Thread(target=tarea) 

hilo.start() 

 

En este ejemplo, se define una función tarea() que simplemente imprime un mensaje en la consola. Luego, se crea un objeto Thread especificando la función tarea como el objetivo del hilo, y se inicia la ejecución del hilo llamando al método start(). 

Concurrencia con ThreadPoolExecutor

Además del módulo threading, Python también proporciona el módulo concurrent.futures, que ofrece una interfaz de alto nivel para trabajar con concurrencia y paralelismo. Este módulo incluye clases como ThreadPoolExecutor y ProcessPoolExecutor, que permiten ejecutar funciones de manera concurrente utilizando pools de hilos o procesos. Aquí tienes un ejemplo de cómo usar ThreadPoolExecutor: 

 

from concurrent.futures import ThreadPoolExecutor 

 

# Definir una función que será ejecutada por un hilo 

def tarea(): 

    print(«Hola desde el hilo») 

 

# Crear un ThreadPoolExecutor con un pool de 5 hilos 

executor = ThreadPoolExecutor(max_workers=5) 

 

# Ejecutar múltiples tareas utilizando el ThreadPoolExecutor 

for _ in range(10): 

    executor.submit(tarea) 

 

# Apagar el ThreadPoolExecutor cuando se hayan completado todas las tareas 

executor.shutdown() 

En este ejemplo, se crea un ThreadPoolExecutor con un máximo de 5 hilos en el pool. Luego, se utiliza el método submit() para enviar las tareas a ejecutar al pool de hilos. Una vez que se han enviado todas las tareas, se llama al método shutdown() para apagar el ThreadPoolExecutor. 

Ahora, si tuviéramos que hacer múltiples solicitudes a diferentes sitios web y procesar los datos, podemos usar un “ThreadPoolExecutor” para enviar las solicitudes en paralelo y luego procesas los resultados de forma concurrente. 

from concurrent.futures import ThreadPoolExecutor 

import requests 

 

# Función para realizar una solicitud HTTP 

def hacer_solicitud(url): 

    response = requests.get(url) 

    return response.text 

 

urls = [‘https://sitio1.com’, ‘https://sitio2.com’, ‘https://sitio3.com’] 

 

# Crear un ThreadPoolExecutor 

with ThreadPoolExecutor() as executor: 

    # Enviar las solicitudes en paralelo 

    resultados = executor.map(hacer_solicitud, urls) 

 

# Procesar los resultados 

for resultado in resultados: 

    procesar(resultado) 

Por lo general, la concurrencia permite a los desarrolladores crear aplicaciones más rápidas y eficientes, aprovechando muy bien los recursos del sistema. Ya sea utilizando el módulo threading para trabajar con hilos de ejecución, aunque crean una capa más de complejidad sobre lo programado en el sistema. 

Compartir en:

Artículos relacionados

Usabilidad

La usabilidad es un concepto fundamental en el diseño y desarrollo de productos, especialmente en el ámbito digital. Se refiere a la medida en que un sistema, producto o servicio puede ser utilizado de manera efectiva y eficiente por sus usuarios, logrando satisfacer

Criptografía

La criptografía es una disciplina que se ha vuelto esencial en la era digital, donde la seguridad de la información se ha convertido en una prioridad. Derivada de la palabra griega kryptos, que significa «oculto», la criptografía se ocupa de proteger los datos mediante técnicas que aseguran que

Puntero

Un puntero es una variable que almacena la dirección de memoria de otra variable. En lugar de contener directamente un valor, como lo haría una variable común, un puntero contiene la ubicación donde se almacena ese valor en la memoria. Los punteros son

Despliegue

El despliegue, sobre todo en contexto de DevOps se refiere al proceso de poner una aplicación o servicio en un entorno de producción, haciendo que esté disponible para los usuarios finales. DevOps, una combinación de “desarrollo” (development) y “operaciones” (operations), es una metodología

Scroll al inicio