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.