Назад к вопросам
Junior
162
questionbank
Что такое WaitGroup в Go и для чего он используется?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
WaitGroup — это механизм синхронизации в Go, который позволяет дождаться завершения группы горутин.
Используется для:
- Ожидания завершения всех горутин перед выходом из функции или программы.
- Координации работы между несколькими горутинами.
Пример использования:
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 // Объявляем WaitGroup
numWorkers := 3
for i := 1; i <= numWorkers; i++ {
wg.Add(1) // Увеличиваем счетчик перед запуском каждой горутины
go worker(i, &wg)
}
wg.Wait() // Блокируем выполнение main до тех пор, пока счетчик не станет равен 0
fmt.Println("Все рабочие закончили работу")
}
Основные методы:
Add(delta int): Увеличивает внутренний счетчикWaitGroupнаdelta. Должен быть вызван перед запуском каждой горутины, за которой нужно следить.Done(): Уменьшает внутренний счетчикWaitGroupна 1. Обычно вызывается вdeferвнутри горутины, чтобы гарантировать уменьшение счетчика даже при панике.Wait(): Блокирует текущую горутину до тех пор, пока внутренний счетчикWaitGroupне станет равен 0.