post

Distribuida

distribuida person encoding in laptop
Photo by Lukas on Pexels.com

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

Leave a Reply

Your email address will not be published. Required fields are marked *