sync.WaitGroup
- Go kursu
- Orta seviye
- Ders 21/80
- 4 dk
WaitGroup ile goroutine'leri beklemeyi öğrenirsin.
sync.WaitGroup
sync.WaitGroup, birden çok goroutine'in tamamlanmasını bekler. Add(n) ile sayaç artırılır, her goroutine Done() ile azaltır, ana program Wait() ile sıfırlanmasını bekler.
Kalıp: wg.Add(1) önce, go func() { defer wg.Done(); ... }() sonra. Add'i goroutine dışında çağır; yoksa yarış oluşur.
WaitGroup deseni
WaitGroup kullanımının doğru deseni:
wg.Add(1)çağrısını goroutine başlatmadan önce yap- Goroutine içinde
defer wg.Done()ile ilk iş olarak azalt - Ana programda
wg.Wait()ile tümü bitene kadar bekle - Döngüde her yinelemede Add(1) yap
Add'i goroutine içinde yaparsan Wait sıfırdan önce geçebilir ve goroutine sızar.
Uygulama WaitGroup ile yazdır
main içine bir sync.WaitGroup tanımı ve fmt.Println ile wg tamam yazdır.
Başlangıç kodu
package main
import "fmt"
func main() {
// buraya yaz
}Örnek çözüm
package main
import (
"fmt"
"sync"
)
func main() {
var wg sync.WaitGroup
wg.Add(1)
go func() { defer wg.Done(); fmt.Println("wg tamam") }()
wg.Wait()
}Beklenen çıktı
wg tamam
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 wg.Done() ne yapar?
- Sayaç azaltır Doğru cevap
- Sayaç artırır
- Beklemeye başlar
- Goroutine öldürür
Açıklama: sayaç azaltır. Add artırır, Done azaltır.
2 WaitGroup kullanımı
var wg sync.WaitGroup
wg.Add(1)
go func() {
defer wg.____()
work()
}()
wg.Wait()
var wg sync.WaitGroup
wg.Add(1)
go func() {
defer wg.Done()
work()
}()
wg.Wait()
Açıklama: Wait ana programda, Done goroutine içindedir.
3 WaitGroup kavramlarını eşleştir
| Kavram | Anlamı |
|---|---|
Add |
Sayaç artır |
Done |
Sayaç azalt |
Wait |
Bekle |
sync.WaitGroup |
Tip |