Sobes.tech
Middle

Que formas de comunicação entre processos conheces?

sobes.tech IA

Resposta da IA

  • Canais: A principal forma idiomática em Go. Concurrências tipadas para transmitir valores entre goroutines ou processos (ao usar meios externos, como sockets Unix).

    // Exemplo de uso de um canal para comunicação entre goroutines
    ch := make(chan int)
    go func() {
        ch <- 1 // envio de valor
    }()
    value := <-ch // recepção de valor
    
  • Mutexes e operações atômicas: Para proteger dados partilhados ao aceder de múltiplos processos.

    import (
        "sync"
        "sync/atomic"
    )
    
    var mu sync.Mutex
    var counter int
    
    func incrementWithMutex() {
        mu.Lock()
        counter++
        mu.Unlock()
    }
    
    var atomicCounter int32
    
    func incrementWithAtomic() {
        atomic.AddInt32(&atomicCounter, 1)
    }
    
  • Memória partilhada: O uso direto pode ser complexo de gerir e suscetível a condições de corrida. Normalmente implementa-se através de outros mecanismos (por exemplo, mapeamento de ficheiros em memória).

  • Interacções de rede (TCP/UDP): Método clássico de comunicação entre processos, especialmente em sistemas distribuídos. Go oferece amplas capacidades para trabalhar com redes.

    // No lado do servidor:
    /*
       listener, _ := net.Listen("tcp", ":8080")
       conn, _ := listener.Accept()
       // leitura/escrita de dados através de conn
    */
    
    // No lado do cliente:
    /*
       conn, _ := net.Dial("tcp", "localhost:8080")
       // leitura/escrita de dados através de conn
    */
    
  • Mecanismos IPC do SO:

    • Sockets de domínio Unix: Forma eficiente de comunicação entre processos na mesma máquina.
    • Canais nomeados (Pipes): Para comunicação unidirecional ou bidirecional.
    • Sinais: Para notificações assíncronas entre processos.
  • Ficheiros: Os processos podem trocar dados escrevendo e lendo em ficheiros partilhados. É necessário usar bloqueios para evitar condições de corrida.

  • Bases de dados e brokers de mensagens: Para cenários mais complexos, comunicação assíncrona e garantir fiabilidade. Exemplos: Kafka, RabbitMQ, Redis (pub/sub), PostgreSQL.