Golang WaitGroup permite bloquear um bloco de código específico para permitir que um conjunto de goroutines conclua a execução. Um exemplo seria bloquear a função principal até que as goroutinas sejam concluídas e depois desbloqueie o grupo.
Exemplo 1
Dê um exemplo abaixo:
Pacote principal
importar "fmt"
Funcrt ()
fmt.Println ("Primeira Go Rotine")
Funcrt2 ()
fmt.Println ("Second Go Rotine")
funcmain ()
vá rt ()
vá rt2 ()
Se você executar o código acima, o programa não imprime nada. Isso ocorre porque a função principal é encerrada ao lançar as goroutinas. Como a função principal é o ponto de entrada de um programa Go, uma vez que termina, o programa termina.
Para lidar com esse caso, podemos usar o Golang Waitgroup. O método do grupo de espera tem três métodos principais:
- Add () - o grupo de espera atua como um contador que mantém o número de funções ou as rotinas de ir aguardar. Se o contador se tornar 0, o grupo de espera libera as goroutinas. Usamos o método Add para adicionar um valor específico ao contador de grupos de espera.
- Espera () - o método de espera bloqueia a execução até que o contador do grupo de espera se torne 0.
- Feito () - diminui o contador do grupo de espera em um valor de 1
Vamos agora recriar o exemplo anterior e usar o WaitGroup para pausar a execução.
Pacote principal
importação (
"FMT"
"sincronizar"
)
Funcrt (WG *Sync.WaitGroup)
fmt.Println ("Primeira Go Rotine")
adiSwg.Done () // Remova a goroutina do balcão do grupo de espera
Funcrt2 (WG *SYNC.WaitGroup)
fmt.Println ("Second Go Rotine")
adiSwg.Feito()
funcmain ()
// novo grupo de espera
WG: = novo (sincronizado.Grupo de espera)
// Adicione duas rotinas GO
WG.Adicionar (2)
GO RT (WG)
vá RT2 (WG)
// Block Execution até feito
WG.Espere()
Agora, se executarmos o código novamente, devemos ver uma saída como:
$ go run waitgroup.ir
Segunda Go Rotine
Primeiro vá rotina
Exemplo 2
Você também pode usar grupos de espera com funções anônimas. Um exemplo é como mostrado abaixo:
Pacote principal
importação (
"FMT"
"sincronizar"
)
WG.Feito()
//
funcmain ()
Varwgsync.Grupo de espera
fori: = 1; eu<= 5; i++
WG.Adicionar (1)
eu: = eu
Gofunc ()
adiSwg.Feito()
fmt.Printf ("Rotina inicial: %d \ n", i)
()
WG.Espere()
O exemplo acima ilustra como usar grupos de espera com uma função anônima. O código acima deve retornar:
Rotina inicial: 1
Rotina inicial: 3
Rotina inicial: 4
Rotina inicial: 5
Rotina inicial: 2
Conclusão
Neste artigo, cobrimos o básico de trabalhar com a subpackage do grupo de espera do pacote de sincronização em Go. Grupos de espera permite que você pause a execução até que um grupo de funções ou Goroutines termine de executar.