馃敊 Regresar

WaitGroups en Go:

Aqu铆 un fragmento de c贸digo para comprender WaitGroups en Go:

package main

import "fmt"

func runner1() {

fmt.Print("\nI am runner 1")

}

func runner2() {

fmt.Print("\nI am runner 2")

}

func execute() {

go runner1()

go runner2()

}

func main() {

// Lanzando ambos runners

execute()

}

Cuando ejecuta este c贸digo, el resultado es nada.

Esto sucede porque, al iniciar ambas gorutinas, la funci贸n principal se termina. Y todos los programas en Golang se ejecutan hasta que la funci贸n principal no se termina.

Soluci贸n

La soluci贸n a este problema es la primitiva de la biblioteca est谩ndar de Go sync.WaitGroup . WaitGroup es en realidad un tipo de contador que bloquea la ejecuci贸n de una funci贸n (o podr铆a decirse una goroutine) hasta que su contador interno se vuelve 0. WaitGroup es seguro para concurrencia, por lo que es seguro pasarle un puntero como argumento para las goroutines.

Sintaxis del c贸digo

package main

import (

"fmt"

"sync"

)

func runner1(wg *sync.WaitGroup) {

defer wg.Done() // Esto disminuye el contador en 1

fmt.Print("\nI am runner 1")

}

func runner2(wg *sync.WaitGroup) {

defer wg.Done()

fmt.Print("\nI am runner 2")

}

func execute() {

wg := new(sync.WaitGroup)

wg.Add(2)

// Aumentando el contador en 2

// porque tenemos 2 gorutinas

go runner1(wg)

go runner2(wg)

// Esto bloquea la ejecuci贸n

// hasta el contador llegue a 0

wg.Wait()

}

func main() {

// Lanzando ambos runners

execute()

}

Salida de c贸digo

I am runner 2

I am runner 1