Ответ
WaitGroup
в Go — это механизм синхронизации из пакета sync
, который позволяет дождаться завершения группы горутин.
Основные методы:
Add(delta int)
— увеличивает счетчик наdelta
(обычно на 1 при запуске горутины).Done()
— уменьшает счетчик на 1 (вызывается в конце горутины).Wait()
— блокирует выполнение, пока счетчик не станет 0.
Пример:
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
for i := 1; i <= 3; i++ {
wg.Add(1) // Увеличиваем счетчик перед запуском каждой горутины
go worker(i, &wg)
}
wg.Wait() // Ждем, пока счетчик не станет 0 (все горутины завершатся)
fmt.Println("Все горутины завершили выполнение.")
}
⚠️ Важно:
Add()
нужно вызывать до запуска горутины, чтобы счетчик был корректно установлен до того, какWait()
начнет проверять его значение.Done()
лучше вызывать черезdefer
, чтобы гарантировать его выполнение даже при панике внутри горутины.- Нельзя использовать
WaitGroup
повторно без сброса счетчика (что обычно не требуется, так какWaitGroup
создается для конкретного набора горутин).