Что такое WaitGroup?
Этот вопрос проверяет знание механизма синхронизации WaitGroup, который используется для ожидания завершения нескольких горутин.
Короткий ответ
WaitGroup в Go — это структура из пакета sync, позволяющая организовать ожидание завершения набора горутин. Она предоставляет методы для увеличения счетчика активных горутин, их завершения и блокировки выполнения до их завершения.
Длинный ответ
WaitGroup — это инструмент синхронизации, который упрощает управление множеством горутин. Его ключевые методы:
- Add(n int) — увеличивает счетчик горутин на n.
- Done() — уменьшает счетчик на 1 (обычно вызывается горутиной по завершении).
- Wait() — блокирует выполнение текущей горутины до обнуления счетчика.
Пример:
package main
import (
"fmt"
"sync"
)
func worker(id int, wg *sync.WaitGroup) {
defer wg.Done() // Уменьшает счетчик после завершения
fmt.Printf("Горутина %d начала работу\n", id)
// Эмуляция работы
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() // Ждем завершения всех горутин
fmt.Println("Все горутины завершены")
}
В каких случаях использовать:
- Для ожидания завершения набора горутин.
- Для синхронизации между основным потоком и конкурентно работающими горутинами.
- При выполнении параллельных задач с неизвестным временем завершения.