Junior — Middle
Como organizar e gerir a sequência de execução dos threads?
sobes.tech IA
Resposta da IA
Em Go, para organizar e gerir a sequência de execução de goroutines, utilizam-se vários mecanismos principais:
-
Canais (channels) — permitem sincronizar as goroutines, transmitindo dados entre elas. Uma goroutine que lê de um canal aguardará até que outra goroutine envie dados, garantindo a ordem.
-
sync.WaitGroup — é usado para esperar que um grupo de goroutines termine. Permite aguardar até que todas as goroutines em execução sejam concluídas.
-
Mutex e outras primitivas do pacote sync — para proteger recursos partilhados e evitar condições de corrida.
Exemplo de uso de canais para execução sequencial:
package main
import (
"fmt"
)
func worker(id int, done chan bool) {
fmt.Printf("Trabalhador %d iniciado\n", id)
// simulação de trabalho
done <- true // sinal de conclusão
}
func main() {
done := make(chan bool)
go worker(1, done)
<-done // espera pela conclusão do trabalhador 1
go worker(2, done)
<-done // espera pela conclusão do trabalhador 2
fmt.Println("Todos os trabalhadores concluíram")
}
Desta forma, usando canais e sincronização, é possível gerir a ordem de execução das goroutines.