Channel Synchronization

Channel Synchronization #

// É possível utilizar canais para sincronizar execuções
// de goroutines. Aqui está um exemplo de utilização
// de um recebimento bloqueante para aguardar a goroutine
// finalizar. Ao aguardar por múltiplas goroutines terminarem,
// talvez seja melhor utilizar [WaitGroup](waitgroups).

package main

import (
	"fmt"
	"time"
)

// Esta função será executada em goroutine.
// O canal `done` será usado para notificar
// outra goroutine que esta função foi finalizada.
func worker(done chan bool) {
	fmt.Print("working...")
	time.Sleep(time.Second)
	fmt.Println("done")

	// Envio de valor para notificar que a execução
	// finalizou
	done <- true
}

func main() {

	// Inicializando a _ worker goroutine_, e passando o canal
	// que será notificado.
	done := make(chan bool, 1)
	go worker(done)

	// O código é bloqueado até a notificação ser recebida.
	<-done
}
$ go run channel-synchronization.go      
working...done                  

# Ao remover o recebimento `<- done` do código, o
# programa será finalizado antes que a _worker goroutine_
# comece a ser executada.