Sobes.tech
Junior

Mi az a WaitGroup a Go-ban, és mire használják?

sobes.tech MI

Válasz az MI-től

A WaitGroup egy szinkronizációs mechanizmus Go-ban, amely lehetővé teszi egy goroutine-csoport befejezésének várását.

A következők céljára használható:

  • Várakozás arra, hogy minden goroutine befejeződjön, mielőtt kilépne a függvényből vagy a programból.
  • Munka koordinálása több goroutine között.

Használati példa:

package main

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

func worker(id int, wg *sync.WaitGroup) {
	defer wg.Done() // Csökkenti a számlálót a goroutine végén

	fmt.Printf("Munkás %d kezdett\n", id)
	time.Sleep(time.Second) // Munka szimuláció
	fmt.Printf("Munkás %d befejezte\n", id)
}

func main() {
	var wg sync.WaitGroup // WaitGroup deklarálása
	numWorkers := 3

	for i := 1; i <= numWorkers; i++ {
		wg.Add(1) // Növeli a számlálót minden goroutine indítása előtt
		go worker(i, &wg)
	}

	wg.Wait() // Blokkolja a main végrehajtását, amíg a számláló el nem éri a 0-t
	fmt.Println("Minden munkás befejezte")
}

Fő metódusok:

  • Add(delta int): Növeli a WaitGroup belső számlálóját delta-val. Minden követett goroutine indítása előtt kell hívni.
  • Done(): Csökkenti a WaitGroup belső számlálóját 1-gyel. Általában defer-rel hívják a goroutine-ban, hogy garantálják a csökkentést még pánik esetén is.
  • Wait(): Blokkolja az aktuális goroutine-t, amíg a WaitGroup belső számlálója el nem éri a 0-t.