Distribuida
la programación distribuida es esencial en entornos modernos donde la escalabilidad, la redundancia y la tolerancia a fallos son fundamentales. Permite a los desarrolladores construir sistemas más flexibles y eficientes al aprovechar los recursos distribuidos de manera efectiva. A continuación se muestra unos ejemplos de su aplicación
Ejemplo: Calculo distribuido.
En este ejemplo simple de programación distribuida se utiliza Python y la biblioteca multiprocessing
. Se simula un cálculo distribuido de la suma de elementos en una lista entre varios procesos en un sistema multicore.
Código
import multiprocessing # Función para sumar elementos en una porción de la lista def suma_parcial(lista, inicio, fin): suma_parcial = sum(lista[inicio:fin]) return suma_parcial if __name__ == "__main__": # Datos de ejemplo (lista de números) datos = list(range(1, 101)) # Dividir la lista en varias partes num_procesos = 4 longitud_sublista = len(datos) // num_procesos sublistas = [(i * longitud_sublista, (i + 1) * longitud_sublista) for i in range(num_procesos)] # Crear procesos y calcular sumas parciales en paralelo procesos = [] for inicio, fin in sublistas: proceso = multiprocessing.Process(target=suma_parcial, args=(datos, inicio, fin)) proceso.start() procesos.append(proceso) # Esperar a que todos los procesos terminen for proceso in procesos: proceso.join() # Recopilar resultados sumas_parciales = [proceso.exitcode for proceso in procesos] # Calcular la suma total suma_total = sum(sumas_parciales) print("Lista completa:", datos) print("Suma total distribuida:", suma_total)
Explicación
Este código divide una lista de números en partes y calcula la suma de cada parte en paralelo utilizando múltiples procesos. Cada proceso suma una porción de la lista, y al final, las sumas parciales se suman para obtener el resultado total. Este es un ejemplo simple de cómo se puede distribuir una tarea entre varios procesos para mejorar el rendimiento en un entorno multicore. En un entorno de programación distribuida a mayor escala, se podrían usar técnicas más avanzadas y herramientas específicas para la programación distribuida, como MPI o Apache Spark.
Ejemplo 2: Comunicación entre procesos
En este ejemplo se utiliza sockets en Python para implementar una comunicación simple entre dos procesos en diferentes máquinas, lo que refleja una situación de programación distribuida. Suponga que se tiene dos máquinas A y B, y se quiere que un proceso en la máquina A envíe un mensaje a un proceso en la máquina B. A continuación el código recomendado.
Código (servidor en máquina B)
import socket # Configurar el servidor host = '0.0.0.0' # Escucha en todas las interfaces puerto = 12345 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as servidor: servidor.bind((host, puerto)) servidor.listen() print(f"Servidor escuchando en {host}:{puerto}") conexion, direccion = servidor.accept() with conexion: print(f"Conexión establecida desde {direccion}") # Recibir y mostrar el mensaje mensaje_recibido = conexion.recv(1024).decode('utf-8') print(f"Mensaje recibido: {mensaje_recibido}")
Código (cliente en la máquina A):
import socket # Configurar el cliente host_servidor = 'dirección_IP_de_B' # Cambiar a la dirección IP de la máquina B puerto_servidor = 12345 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as cliente: cliente.connect((host_servidor, puerto_servidor)) # Enviar un mensaje al servidor mensaje = "Hola desde el cliente" cliente.sendall(mensaje.encode('utf-8')) print("Mensaje enviado exitosamente.")
Explicación
Este ejemplo ilustra la comunicación básica entre dos procesos en máquinas diferentes mediante sockets. Se puede ejecutar el servidor en la máquina B y el cliente en la máquina A. Se debe asegurar de reemplazar ‘dirección_IP_de_B’ con la dirección IP real de la máquina B.
Esta práctica refleja un escenario de programación distribuida donde los procesos pueden ejecutarse en diferentes máquinas y comunicarse a través de la red. En entornos más complejos, se podría utilizar bibliotecas específicas de programación distribuida como ZeroMQ, RabbitMQ, o incluso MPI