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: