Primeira vez aqui? Seja bem vindo e cheque o FAQ!
x

Como utilizar processamento distribuído em Python?

+1 voto
564 visitas
perguntada Abr 28, 2016 em Ciência da Computação por PRosa (61 pontos)  

Muitas vezes o custo computacional de algoritmos complexos pode ser dividido entre computadores disponíveis em uma rede, utilizando-se o processamento distribuído, onde cada nó processador executa determinado serviço para a solução de um problema.

Compartilhe

1 Resposta

+1 voto
respondida Abr 28, 2016 por PRosa (61 pontos)  
editado Abr 28, 2016 por PRosa

O código abaixo implementa um algoritmo simples para identificar o maior número de um vetor, utilizando o processador local e um processador remoto via sockets (configurado para localhost para facilitar o teste).

Inicialmente deve-se ativar o "servidor", executando em uma janela DOS: python VetorServer.py

# VetorServer.py    
import socket, pickle
from VetorLocal import maior_ProcessamentoLocal

if __name__ == "__main__":

    HOST = ''    
    PORT = 50020   # porta para o socket
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.bind((HOST, PORT))
    s.listen(1)
    print "Pronto"

    while True:
        conn, addr = s.accept()
        print 'Chamada de ', addr
        while True:
            data = conn.recv(512)
            if not data: break
            dadosRecebidos=pickle.loads(data)
            print "Dados recebidos:", dadosRecebidos    
            retorno=str(maior_ProcessamentoLocal(dadosRecebidos))
            print "Maior:", retorno
            conn.sendall(retorno)
        conn.close()
        print "Conexao encerrada\n"

Em outra sessão do DOS ou do ambiente IDE, rodar o código "cliente" (VetorLocal.py):

# VetorLocal.py    
import socket, pickle

def maior_ProcessamentoDistribuido(vet):

    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect(("127.0.0.1", 50020))
    dados_enviar=pickle.dumps(vet)
    s.sendall(dados_enviar)
    retorno = int(s.recv(512))
    s.close()

    return retorno

def maior_ProcessamentoLocal(vet):

    maior=0    
    for i in vet:
        if i>maior:
          maior=i
    return maior

if __name__ == "__main__":

    vetor = [5,7,4,20,90,10,15,13,6,2,4,10,18,119,30,1]

    vetorParte1 = vetor[0:8]
    vetorParte2 = vetor[8:18]

    maiorElemento_parte1 = maior_ProcessamentoLocal(vetorParte1)
    maiorElemento_parte2 = maior_ProcessamentoDistribuido(vetorParte2)

    print "Maior elemento do vetor:"    
    if maiorElemento_parte1 > maiorElemento_parte2:
        print maiorElemento_parte1
    else:
        print maiorElemento_parte2

Outra alternativa é o uso da biblioteca SPADE (Smart Python multi-Agent Development Environment) que implementa os padrões FIPA para comunicação entre agentes em um sistema distribuído, além de oferecer uma plataforma para registro de agentes e serviços ofertados.

comentou Abr 29, 2016 por danielcajueiro (5,776 pontos)  
Que legal! Vou dar uma olhada com cuidado e depois divulgar. Nunca olhei isso com cuidado no Python, mas é um tópico importante que pensava inclusive em mencionar no curso. Você adiantou nosso trabalho. Abraco
...