sync.WaitGroup — это примитив синхронизации, который используется, чтобы дождаться, пока коллекция горутин завершит свою работу, прежде чем двигаться дальше.
Три основных метода:
Add(n) - Увеличивает внутренний счётчик на n, указывая, сколько горутин нужно ждатьDone() - Уменьшает счётчик на 1, сигнализируя, что горутина закончила работуWait() - Блокирует выполнение, пока внутренний счётчик не достигнет нуляvar wg sync.WaitGroup
// Говорим WaitGroup, что будет 1 горутина
wg.Add(1)
go func() {
// defer гарантирует, что Done() вызовется даже при panic
defer wg.Done()
// Выполняем реальную работу здесь
}()
// Блокируем, пока все горутины не вызовут Done()
wg.Wait()
Add() перед запуском горутин, чтобы избежать гонок данныхdefer wg.Done(), чтобы гарантировать декремент счётчика даже при ошибкахWait() из главной горутины или координирующей рутины, чтобы заблокировать выполнение до завершенияAdd() после того, как горутины уже начали выполнятьсяКогда запускаешь несколько горутин, увеличивай счётчик соответственно:
for i := 0; i < 5; i++ {
wg.Add(1)
go func() {
defer wg.Done()
// work
}()
}
wg.Wait()
Этот паттерн гарантирует, что твоя программа дождётся, пока все горутины завершатся, прежде чем выйти, предотвращая преждевременное завершение или гонки данных.
Метод Add() должен быть вызван после запуска горутины, чтобы гарантировать корректное увеличение счётчика WaitGroup перед началом выполнения горутины.
Новый — ещё не проверен сообществом
Вы