Sobes.tech
Junior

რა მიზნით გამოიყენება WaitGroup Go-ში?

sobes.tech AI

პასუხი AI-სგან

WaitGroup ერთ ან რამდენიმე goroutine-ის მუშაობის სინქრონიზაციისთვის გამოიყენება. ეს საშუალებას აძლევს მთავარ goroutine-ს დაელოდოს შექმნილი სხვა goroutine-ების დასრულებას. იგი შედგება გამრიცხველისგან, რომელიც იზრდება goroutine-ის შექმნისას და მცირდება მისი დასრულებისას.

ძირითადი მეთოდები:

  • Add(delta int): ზრდის ან მცირედით ამცირებს goroutine-ების რაოდენობას.
  • Done(): მცირედით ამცირებს გამრიცხველს 1-ით. ჩვეულებრივ, გამოიძახება goroutine-ის ბოლოს (ხშირად defer-თან ერთად).
  • Wait(): ბლოკავს შესრულებას მანამ, სანამ გამრიცხველი არ გახდება ნული.

გამოყენების მაგალითი:

package main

import (
	"fmt"
	"sync"
)

func worker(id int, wg *sync.WaitGroup) {
	defer wg.Done() // მცირედით ამცირებს გამრიცხველს goroutine-ის დასრულებაზე

	fmt.Printf("Goroutine %d იწყება\n", id)
	// სამუშაოს სიმულაცია
	// time.Sleep(time.Second)
	fmt.Printf("Goroutine %d დასრულდა\n", id)
}

func main() {
	var wg sync.WaitGroup // შექმენით WaitGroup

	for i := 1; i <= 5; i++ {
		wg.Add(1) // თითოეული goroutine-ისთვის გამრიცხველის გაზრდა
		go worker(i, &wg) // goroutine-ის დაწყება, გადაცემა გამრიცხველის მაჩვენებელი
	}

	wg.Wait() // დაელოდეთ, სანამ გამრიცხველი არ გახდება ნული (ყველა goroutine დასრულდება)
	fmt.Println("ყველა goroutine დასრულდა")
}