Sobes.tech
Junior

Go tilida WaitGroup nima va u nima uchun ishlatiladi?

sobes.tech AI

AIdan javob

WaitGroup — bu Go dasturida sinxronizatsiya mexanizmi bo‘lib, u gorutinlar guruhining yakunlanishini kutishga imkon beradi.

U quyidagilar uchun ishlatiladi:

  • Barcha gorutinlar tugashini kutish va funksiyadan yoki dasturdan chiqishdan oldin.
  • Bir nechta gorutinlar o‘rtasida ishni muvofiqlashtirish.

Foydalanish misoli:

package main

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

func worker(id int, wg *sync.WaitGroup) {
	defer wg.Done() // Gorutin tugaganidan so‘ng hisoblagichni kamaytiradi

	fmt.Printf("Ishchi %d ish boshladi\n", id)
	time.Sleep(time.Second) // Ishni taqlid qilish
	fmt.Printf("Ishchi %d ishni tugatdi\n", id)
}

func main() {
	var wg sync.WaitGroup // WaitGroup e’lon qilamiz
	numWorkers := 3

	for i := 1; i <= numWorkers; i++ {
		wg.Add(1) // Har bir gorutinni ishga tushirishdan oldin hisoblagichni oshiramiz
		go worker(i, &wg)
	}

	wg.Wait() // hisoblagich 0 bo‘lgunga qadar mainni bloklaydi
	fmt.Println("Barcha ishchilar tugatdi")
}

Asosiy metodlar:

  • Add(delta int): WaitGroup ning ichki hisoblagichini delta ga oshiradi. Har bir kuzatiladigan gorutinni ishga tushirishdan oldin chaqirilishi kerak.
  • Done(): WaitGroup ning ichki hisoblagichini 1 ga kamaytiradi. Odatda, gorutin ichida defer bilan chaqiriladi, shunda panik bo‘lsa ham hisoblagich kamaytiriladi.
  • Wait(): Hozirgi gorutinni bloklaydi, hisoblagich 0 ga yetguncha.