CodeBlanks Logo Icon CodeBlanks

sync.WaitGroup

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

main.go
package main

import "fmt"

func main() {
    // buraya yaz
}

Örnek çözüm

main.go
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ı

Soru
var wg sync.WaitGroup
wg.Add(1)
go func() {
    defer wg.____()
    work()
}()
wg.Wait()
Cevap
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

Orta seviye bölümündeki tüm dersler