Passagem de Mensagens (Message Passing)
Definição
Passagem de Mensagens (ou message passing) é um modelo de comunicação concorrente em que processos ou threads trocam informações enviando mensagens explícitas entre si, em vez de acessarem memória compartilhada.
Nesse modelo, cada unidade de execução mantém seu próprio estado isolado, e toda coordenação ocorre por meio de envio e recebimento de mensagens.
É uma alternativa segura ao uso de locks e memória compartilhada, especialmente útil em arquiteturas distribuídas, sistemas concorrentes modernos e linguagens que valorizam imutabilidade.
Objetivos do uso de Message Passing
- Evitar problemas de concorrência, como condições de corrida e deadlocks.
- Promover isolamento entre tarefas, com comunicação explícita.
- Facilitar paralelismo seguro em sistemas com múltiplos processos ou threads.
- Aplicar o modelo de atores, como visto em linguagens como Erlang, Elixir e no framework Akka.
Exemplo prático (Python)
from multiprocessing import Process, Queue
def produtor(fila):
for i in range(5):
fila.put(f"Mensagem {i}")
def consumidor(fila):
while not fila.empty():
msg = fila.get()
print("Consumidor recebeu:", msg)
if __name__ == "__main__":
fila = Queue()
p1 = Process(target=produtor, args=(fila,))
p2 = Process(target=consumidor, args=(fila,))
p1.start()
p1.join() # aguarda o produtor terminar
p2.start()
p2.join() # aguarda o consumidor terminar
Saída esperada
Consumidor recebeu: Mensagem 0
Consumidor recebeu: Mensagem 1
Consumidor recebeu: Mensagem 2
Consumidor recebeu: Mensagem 3
Consumidor recebeu: Mensagem 4
A fila (
Queue
) atua como canal de comunicação entre os processos.Os processos não compartilham variáveis diretamente.
O modelo é seguro e evita condições de corrida por design.
O ciclo da passagem de mensagens
[Produtor] --> envia mensagens --> [Canal] --> [Consumidor] lê mensagens
- Cada parte mantém seu estado privado.
- Toda interação ocorre por mensagens explícitas.
Onde é aplicado
- Sistemas distribuídos e de múltiplos processos.
- Ambientes com forte isolamento de estado (ex: microserviços).
- Linguagens como Erlang, Elixir, Go (com canais), Rust (com
mpsc
), Java (com filas).
ℹ️ Info: O modelo de message passing é considerado mais fácil de razonar do que o uso direto de locks,
pois elimina a necessidade de sincronização manual e favorece o isolamento entre componentes.