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