Sobes.tech
Junior

O que é WaitGroup em Go e para que é usado?

sobes.tech IA

Resposta da IA

WaitGroup é um mecanismo de sincronização em Go que permite aguardar a conclusão de um grupo de goroutines.

É utilizado para:

  • Aguardar que todas as goroutines terminem antes de sair da função ou programa.
  • Coordenar o trabalho entre várias goroutines.

Exemplo de uso:

package main

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

func worker(id int, wg *sync.WaitGroup) {
	defer wg.Done() // Diminui o contador ao terminar a goroutine

	fmt.Printf("Trabalhador %d começou\n", id)
	time.Sleep(time.Second) // Simulação de trabalho
	fmt.Printf("Trabalhador %d terminou\n", id)
}

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

	for i := 1; i <= numWorkers; i++ {
		wg.Add(1) // Incrementa o contador antes de lançar cada goroutine
		go worker(i, &wg)
	}

	wg.Wait() // Bloqueia a execução do main até que o contador seja 0
	fmt.Println("Todos os trabalhadores terminaram")
}

Métodos principais:

  • Add(delta int): Incrementa o contador interno do WaitGroup em delta. Deve ser chamado antes de lançar cada goroutine que se deseja acompanhar.
  • Done(): Diminui o contador interno do WaitGroup em 1. Normalmente chamado com defer dentro da goroutine para garantir a redução mesmo em caso de pânico.
  • Wait(): Bloqueia a goroutine atual até que o contador interno do WaitGroup seja 0.