Sobes.tech
Junior

WaitGroup дар Go чист ва барои чӣ истифода мешавад?

sobes.tech AI

Ҷавоб аз AI

WaitGroup — это механізм сінхранізацыі ў Go, які дазваляе чакаць завяршэння групы goroutines.

Выкарыстоўваецца для:

  • Чакання завяршэння ўсіх goroutines перад выхадам з функцыі або праграмы.
  • Каардынацыі працы паміж некалькімі goroutines.

Прыклад выкарыстання:

package main

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

func worker(id int, wg *sync.WaitGroup) {
	defer wg.Done() // Змяншае лічыльнік пасля завяршэння goroutine

	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. Павінна быць выклікана перад запуском кожнай goroutine, якую трэба сачыць.
  • Done(): Змяншае ўнутраны лічыльнік WaitGroup на 1. Звычайна выклікаецца з defer унутры goroutine, каб гарантаваць змяншэнне нават у выпадку панікі.
  • Wait(): Блакуе бягучую goroutine, пакуль унутраны лічыльнік WaitGroup не стане 0.