Sobes.tech
Junior

Kas yra WaitGroup Go kalboje ir kam jis naudojamas?

sobes.tech AI

Atsakymas iš AI

WaitGroup yra sinchronizacijos mechanizmas Go kalboje, leidžiantis laukti, kol baigsis gorutinų grupė.

Jis naudojamas:

  • Laukti, kol visi gorutinai baigs darbą prieš išeinant iš funkcijos ar programos.
  • Koordinuoti darbą tarp kelių gorutinų.

Naudojimo pavyzdys:

package main

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

func worker(id int, wg *sync.WaitGroup) {
	defer wg.Done() // Sumažina skaitiklį, kai gorutina baigiasi

	fmt.Printf("Darbininkas %d pradėjo\n", id)
	time.Sleep(time.Second) // Darbo imitacija
	fmt.Printf("Darbininkas %d baigė\n", id)
}

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

	for i := 1; i <= numWorkers; i++ {
		wg.Add(1) // Padidina skaitiklį prieš kiekvieną gorutiną
		go worker(i, &wg)
	}

	wg.Wait() // Blokuoja main vykdymą, kol skaitiklis nepasieks 0
	fmt.Println("Visi darbininkai baigė darbą")
}

Pagrindiniai metodai:

  • Add(delta int): Padidina WaitGroup vidinį skaitiklį delta-u. Jis turi būti iškviestas prieš kiekvieną stebimą gorutiną.
  • Done(): Sumažina WaitGroup vidinį skaitiklį 1-iu. Paprastai iškviečiama su defer gorutinose, kad būtų garantuotas sumažinimas net ir panikos atveju.
  • Wait(): Blokuoja esamą gorutiną, kol WaitGroup vidinis skaitiklis nepasieks 0.