Sobes.tech
Junior

¿Qué es WaitGroup en Go y para qué se utiliza?

sobes.tech AI

Respuesta de la IA

WaitGroup es un mecanismo de sincronización en Go que permite esperar a que finalice un grupo de goroutines.

Se utiliza para:

  • Esperar a que todas las goroutines terminen antes de salir de la función o programa.
  • Coordinar el trabajo entre varias goroutines.

Ejemplo de uso:

package main

import (
	"fmt"
	"sync"
	"time"
)

func worker(id int, wg *sync.WaitGroup) {
	defer wg.Done() // Disminuye el contador al finalizar la goroutine

	fmt.Printf("Trabajador %d comenzó\n", id)
	time.Sleep(time.Second) // Simulación de trabajo
	fmt.Printf("Trabajador %d terminó\n", id)
}

func main() {
	var wg sync.WaitGroup // Declaramos WaitGroup
	numWorkers := 3

	for i := 1; i <= numWorkers; i++ {
		wg.Add(1) // Incrementamos el contador antes de lanzar cada goroutine
		go worker(i, &wg)
	}

	wg.Wait() // Bloquea la ejecución de main hasta que el contador llegue a 0
	fmt.Println("Todos los trabajadores han terminado")
}

Métodos principales:

  • Add(delta int): Incrementa el contador interno de WaitGroup en delta. Debe ser llamado antes de lanzar cada goroutine que se desea seguir.
  • Done(): Disminuye el contador interno de WaitGroup en 1. Normalmente se llama en defer dentro de la goroutine para garantizar que se reduzca incluso en caso de pánico.
  • Wait(): Bloquea la goroutine actual hasta que el contador interno de WaitGroup llegue a 0.