Sobes.tech
Junior

Ինչ է WaitGroup-ը Go-ում և ինչու է այն օգտագործվում?

sobes.tech AI

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

WaitGroup-ը սինխրոնիզացիայի մեխանիզմ է Go-ում, որը թույլ է տալիս սպասել գորուտինների խմբի ավարտին:

Օգտագործվում է՝

  • Բոլոր գորուտինների ավարտին սպասելու համար նախքան ֆունկցիայից կամ ծրագրից դուրս գալը:
  • Աշխատանքի համակարգում մի քանի գորուտինների միջև:

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

package main

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

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

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

func main() {
	var wg sync.WaitGroup // Հայտարարում ենք WaitGroup
	numWorkers := 3

	for i := 1; i <= numWorkers; i++ {
		wg.Add(1) // Հաշվիչը մեծացնում ենք յուրաքանչյուր գորուտինի առաջ
		go worker(i, &wg)
	}

	wg.Wait() // Բլոկավորում է main-ի կատարմանը մինչև հաշվիչը դառնա 0
	fmt.Println("Բոլոր աշխատողները ավարտեցին")
}

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

  • Add(delta int): Մեծացնում է WaitGroup-ի ներքին հաշվիչը delta-ով: Պետք է կանչել յուրաքանչյուր հետևվող գորուտին սկսելուց առաջ:
  • Done(): Կրճատում է WaitGroup-ի ներքին հաշվիչը 1-ով: Հաճախ կանչվում է defer-ով գորուտինում՝ ապահովելու կրճատումը նույնիսկ պանիկի դեպքում:
  • Wait(): Բլոկավորում է ընթացիկ գորուտինին մինչև WaitGroup-ի ներքին հաշվիչը դառնա 0: