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.