Sobes.tech
Junior

Pentru ce este folosit WaitGroup în Go?

sobes.tech AI

Răspuns de la AI

WaitGroup este utilizat pentru a sincroniza munca unei sau mai multor goroutines. Permite goroutinei principale să aștepte finalizarea altor goroutines create. Este format dintr-un contor care crește atunci când se creează o goroutine și scade când aceasta se termină.

Metode principale:

  • Add(delta int): Crește sau scade contorul goroutines.
  • Done(): Scade contorul cu 1. De obicei este apelat la sfârșitul unei goroutines (adesea cu defer).
  • Wait(): Blochează execuția până când contorul devine zero.

Exemplu de utilizare:

package main

import (
	"fmt"
	"sync"
)

func worker(id int, wg *sync.WaitGroup) {
	defer wg.Done() // Scade contorul la finalul goroutinei

	fmt.Printf("Goroutine %d începe\n", id)
	// Simulare de muncă
	// time.Sleep(time.Second)
	fmt.Printf("Goroutine %d s-a terminat\n", id)
}

func main() {
	var wg sync.WaitGroup // Creăm un WaitGroup

	for i := 1; i <= 5; i++ {
		wg.Add(1) // Crește contorul pentru fiecare goroutine
		go worker(i, &wg) // Pornește goroutine, transmitând pointerul către WaitGroup
	}

	wg.Wait() // Așteaptă până când contorul devine zero (toate goroutinele se termină)
	fmt.Println("Toate goroutinele s-au terminat")
}