41 - Goroutines - tipo WaitGroup

El paquete sync dispone de un struct llamado WaitGroup con una serie de métodos.

Este struct y sus métodos nos permiten llevar un conteo de las goroutines en ejecución.

Dispone de los siguientes métodos:

  • Add : incrementa la cantidad de goroutines activos.
  • Done : Resta en uno la cantidad de goroutines activas.
  • Wait : No finaliza esta función hasta que el contador de goroutines llegue a cero.

Problema 1:

Mostrar el número "0" mil veces y el número "1" mil veces. Utilizar la programación concurrente.
Administrar la finalización del programa mediante un tipo WaitGroup.

Programa: ejercicio165.go

package main

import (
    "fmt"
    "sync"
)

var wg sync.WaitGroup

func mostrar0() {
    for f := 1; f <= 1000; f++ {
        fmt.Print("0-")
    }
    wg.Done()
}

func mostrar1() {
    for f := 1; f <= 1000; f++ {
        fmt.Print("1-")
    }
    wg.Done()    
}

func main() {
    wg.Add(2)
    go mostrar0()
    go mostrar1()
    wg.Wait()
}

Para definir una variable de tipo WaitGroup debemos importar el paquete sync donde esta define:

import (
    "fmt"
    "sync"
)

Definimos una variable global del tipo WaitGroup:

var wg sync.WaitGroup

Como sabemos este programa lanza dos Goroutine por lo que llamamos al método Add pasando el valor 2:

func main() {
    wg.Add(2)

Seguidamente lanzamos las dos Goroutines:

    go mostrar0()
    go mostrar1()

Llamamos al método Wait del objeto wg del tipo WaitGroup que se detiene en su interior hasta que las dos Goroutines finalizan:

    wg.Wait()
}