Sobes.tech
Junior

Mis on WaitGroup Go-s ja milleks seda kasutatakse?

sobes.tech AI

Vastus AI-lt

WaitGroup on sünkroniseerimismehhanism Go keeles, mis võimaldab oodata gorutinite grupi lõpetamist.

Seda kasutatakse:

  • Ootamaks, kuni kõik gorutinid lõpetavad enne funktsiooni või programmi väljumist.
  • Töö koordineerimiseks mitme gorutini vahel.

Kasutusnäide:

package main

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

func worker(id int, wg *sync.WaitGroup) {
	defer wg.Done() // Vähendab loendurit gorutina lõpus

	fmt.Printf("Tööline %d alustas\n", id)
	time.Sleep(time.Second) // Töö simulatsioon
	fmt.Printf("Tööline %d lõpetas\n", id)
}

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

	for i := 1; i <= numWorkers; i++ {
		wg.Add(1) // Suurendab loendurit enne iga gorutina käivitamist
		go worker(i, &wg)
	}

	wg.Wait() // Blokeerib maini täitmise, kuni loendur jõuab 0-ni
	fmt.Println("Kõik tööline lõpetasid")
}

Peamised meetodid:

  • Add(delta int): Suurendab WaitGroup sisemist loendurit delta-ga. Tuleb seda kutsuda enne iga jälgitava gorutina käivitamist.
  • Done(): Vähendab WaitGroup sisemist loendurit 1-iga. Tavaliselt kutsutakse defer-iga gorutinas, et tagada loenduri vähendamine isegi panic'i korral.
  • Wait(): Blokeerib jooksva gorutina, kuni WaitGroup sisemine loendur jõuab 0-ni.