Sobes.tech
Junior

Goда WaitGroup эмне жана ал эмне үчүн колдонулат?

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() // 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() // эсептегич 0 болгонго чейин main ишин токтотот
	fmt.Println("Бардык жумушчулар аяктады")
}

Негизги ыкмалары:

  • Add(delta int): WaitGroupтин ички эсептегичин deltaга көбөйтөт. Ар бир көзөмөлгө алынган goroutine'ду ишке киргизүүдөн мурун чакырылышы керек.
  • Done(): WaitGroupтин ички эсептегичин 1ге азайтат. Адатта, goroutine ичинде defer менен чакырылат, ошондо паника болсо да эсептегич азайтылат.
  • Wait(): Учурдагы goroutine'ду блоктоп, WaitGroupтин ички эсептегичи 0 болгонго чейин күтөт.