Sobes.tech
Junior

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

sobes.tech AI

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

WaitGroup — ეს არის სინქრონიზაციის მექანიზმი Go-ში, რომელიც საშუალებას აძლევს დაელოდო goroutine-ების ჯგუფის დასრულებას.

გამოყენება ხდება:

  • ყველა goroutine-ის დასრულების მოლოდინით ფუნქციიდან ან პროგრამიდან გამოსვლის წინ.
  • რამდენიმე goroutine-ის შორის მუშაობის კოორდინაციით.

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

package main

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

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

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

func main() {
	var wg sync.WaitGroup // WaitGroup-ის გამოცხადება
	numWorkers := 3

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

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

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

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