Sobes.tech
Junior

Ի՞նչ նպատակով է օգտագործվում WaitGroup-ը Go-ում։

sobes.tech AI

Պատասխան AI-ից

WaitGroup օգտագործվում է մեկ կամ մի քանի goroutine-ների աշխատանքը սինխրոնիզացնելու համար: Դա թույլ է տալիս հիմնական goroutine-ին սպասել ստեղծված այլ goroutine-ների ավարտին: Այն բաղկացած է հաշվիչից, որը մեծանում է goroutine ստեղծելիս և նվազում է, երբ այն ավարտվում է:

Հիմնական մեթոդներ՝

  • Add(delta int): Հաշվիչը մեծացնում կամ նվազեցնում է goroutine-ների քանակը:
  • Done(): Հաղորդում է հաշվիչին, որ goroutine-ը ավարտվել է (հաճախ defer-ի հետ):
  • Wait(): Բլոկավորում է գործարկումը մինչև հաշվիչը դառնա զրո:

Օգտագործման օրինակ՝

package main

import (
	"fmt"
	"sync"
)

func worker(id int, wg *sync.WaitGroup) {
	defer wg.Done() // Նվազեցնում է հաշվիչը goroutine- ի ավարտին

	fmt.Printf("Goroutine %d սկսվում է\n", id)
	// Աշխատանքի սիմուլացիա
	// time.Sleep(time.Second)
	fmt.Printf("Goroutine %d ավարտվեց\n", id)
}

func main() {
	var wg sync.WaitGroup // Ստեղծում է WaitGroup

	for i := 1; i <= 5; i++ {
		wg.Add(1) // Մեծացնում է հաշվիչը յուրաքանչյուր goroutine-ի համար
		go worker(i, &wg) // Սկսում է goroutine, փոխանցելով ցուցիչը
	}

	wg.Wait() // Կապում է գործարկումը մինչև հաշվիչը դառնա զրո
	fmt.Println("Բոլոր goroutine-ները ավարտվեցին")
}