Go by Example: WaitGroups

Bir nechta goroutinaning tugashini kutish uchun biz wait group (kutish guruhi) dan foydalanishimiz mumkin.

package main
import (
    "fmt"
    "sync"
    "time"
)

Bu har bir goroutinada ishga tushiradigan funksiyamiz.

func worker(id int) {
    fmt.Printf("Worker %d starting\n", id)

Resurs talab qiladigan vazifani simulyatsiya qilish uchun uxlaymiz.

    time.Sleep(time.Second)
    fmt.Printf("Worker %d done\n", id)
}
func main() {

Bu WaitGroup shu yerda ishga tushirilgan barcha goroutinalarning tugashini kutish uchun ishlatiladi. Eslatma: agar WaitGroup funksiyalarga aniq uzatilsa, bu ko’rsatkich orqali amalga oshirilishi kerak.

    var wg sync.WaitGroup

WaitGroup.Go yordamida bir nechta goroutina ishga tushiramiz

    for i := 1; i <= 5; i++ {
        wg.Go(func() {
            worker(i)
        })
    }

wg tomonidan boshlangan barcha goroutinalar tugaguncha bloklaymiz. Goroutina o’zi chaqirgan funksiya qaytarganda tugagan hisoblanadi.

    wg.Wait()

E’tibor bering, bu yondashuvda ishchilardan xatolarni tarqatishning oddiy usuli yo’q. Yanada murakkab holatlar uchun errgroup paketidan foydalanishni ko’rib chiqing.

}
$ go run waitgroups.go
Worker 5 starting
Worker 3 starting
Worker 4 starting
Worker 1 starting
Worker 2 starting
Worker 4 done
Worker 1 done
Worker 2 done
Worker 5 done
Worker 3 done

Ishchilarning ishga tushish va tugash tartibi har bir chaqiruvda boshqacha bo’lishi ehtimoli yuqori.

Keyingi misol: .