Golang WaitGroup

Golang WaitGroup
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:

  1. 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.
  2. Espera () - o método de espera bloqueia a execução até que o contador do grupo de espera se torne 0.
  3. 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.