Golang WaitGroup

Golang WaitGroup
Golang WaitGroup le permite bloquear un bloque de código específico para permitir que un conjunto de goroutinas complete la ejecución. Un ejemplo sería bloquear la función principal hasta que se completen las goroutinas y luego desbloquee el grupo.

Ejemplo 1

Tome un ejemplo a continuación:

paquete principal
importar "fmt"
funcrt ()
fmt.Println ("Primera rutina")

funcrt2 ()
fmt.Println ("Segunda rutina de Go)

funcmain ()
GO RT ()
GO RT2 ()

Si ejecuta el código anterior, el programa no imprime nada. Esto se debe a que la función principal se termina al lanzar las Goroutinas. Dado que la función principal es el punto de entrada de un programa GO, una vez que termina, el programa finaliza.

Para manejar tal caso, podemos usar Golang WaitGroup. El método WaitGroup tiene tres métodos principales:

  1. Add (): el grupo de espera actúa como un contador que contiene el número de funciones o las rutinas de Go para esperar. Si el mostrador se convierte en 0, el grupo de espera libera las Goroutinas. Utilizamos el método Agregar para agregar un valor específico al contador WaitGroup.
  2. Wait (): el método de espera bloquea la ejecución hasta que WaitGroup Counter se convierte en 0.
  3. Hecho () - disminuye el contador de grupos de espera por un valor de 1

Recreemos ahora el ejemplo anterior y usemos WaitGroup para pausar la ejecución.

paquete principal
importar (
"FMT"
"Sincronización"
)
Fundrt (WG *Sync.WaitGroup)
fmt.Println ("Primera rutina")
aplazar.Hecho () // retira la goroutine del contador de espera de Wait

FUNCRT2 (WG *SYNC.WaitGroup)
fmt.Println ("Segunda rutina de Go)
aplazar.Hecho()

funcmain ()
// Nuevo grupo de espera
wg: = nuevo (sincronización.WaitGroup)
// Agregar dos rutinas GO
WG.Agregar (2)
Go RT (WG)
Go RT2 (WG)
// Bloquee la ejecución hasta que se haga
WG.Esperar()

Ahora, si volvemos a ejecutar el código, deberíamos ver una salida como:

$ Go Run WaitGroup.ir
Segunda rutina de ir
Primera rutina de Go

Ejemplo 2

También puede usar WaitGroups con funciones anónimas. Un ejemplo es como se muestra a continuación:

paquete principal
importar (
"FMT"
"Sincronización"
)
WG.Hecho()
//
funcmain ()
varwgsync.Grupo de espera
fori: = 1; i<= 5; i++
WG.Agregar (1)
i: = i
gofunc ()
aplazar.Hecho()
fmt.Printf ("Rutina de inicio: %d \ n", i)
()

WG.Esperar()

El ejemplo anterior ilustra cómo usar grupos de espera con una función anónima. El código anterior debería devolver:

Rutina de inicio: 1
Rutina de inicio: 3
Rutina de inicio: 4
Rutina de inicio: 5
Rutina de inicio: 2

Conclusión

En este artículo, cubrimos los conceptos básicos de trabajar con el subpackage de WaitGroup del paquete de sincronización en GO. WaitGroups le permite detener la ejecución hasta que un grupo de funciones o Goroutinas termine de ejecutar la ejecución.