Что такое WaitGroup в Go
1️⃣ Как кратко ответить
WaitGroup в Go — это структура из пакета sync, которая используется для ожидания завершения группы горутин. Она позволяет основной горутине блокироваться до тех пор, пока все горутины в группе не завершат выполнение.
2️⃣ Подробное объяснение темы
WaitGroup — это часть стандартной библиотеки Go, предоставляемая в пакете sync. Она используется для синхронизации выполнения горутин, позволяя основной горутине ждать завершения других горутин. Это особенно полезно, когда у вас есть несколько горутин, выполняющих параллельные задачи, и вы хотите дождаться их завершения перед продолжением выполнения основной программы.
Как работает WaitGroup
WaitGroup работает с тремя основными методами:
Add(delta int): Увеличивает (или уменьшает) счетчик горутин на указанное значениеdelta. Обычно вызывается перед запуском горутин.Done(): Уменьшает счетчик на единицу. Вызывается в каждой горутине, когда она завершает свою работу.Wait(): Блокирует выполнение до тех пор, пока счетчик не станет равным нулю.
Пример использования
Рассмотрим пример, где мы запускаем несколько горутин и используем WaitGroup для ожидания их завершения:
package main
import (
"fmt"
"sync"
"time"
)
func worker(id int, wg *sync.WaitGroup) {
// Указываем, что горутина завершила выполнение
defer wg.Done()
// Симулируем выполнение работы
fmt.Printf("Worker %d starting\n", id)
time.Sleep(time.Second)
fmt.Printf("Worker %d done\n", id)
}
func main() {
// Создаем экземпляр WaitGroup
var wg sync.WaitGroup
// Запускаем 5 горутин
for i := 1; i <= 5; i++ {
// Увеличиваем счетчик горутин
wg.Add(1)
// Запускаем горутину
go worker(i, &wg)
}
// Ожидаем завершения всех горутин
wg.Wait()
fmt.Println("All workers done")
}
Объяснение кода
-
Создание WaitGroup: В
mainсоздается переменнаяwgтипаsync.WaitGroup. Это объект, который будет отслеживать количество активных горутин. -
Запуск горутин: В цикле
forзапускается 5 горутин. Для каждой из них:- Вызывается
wg.Add(1), чтобы увеличить счетчик активных горутин на 1. - Запускается функция
workerв отдельной горутине, которой передается идентификатор и указатель наwg.
- Вызывается
-
Функция worker:
- Использует
defer wg.Done(), чтобы гарантировать вызовDone()при завершении работы горутины, уменьшая счетчик на 1. - Симулирует выполнение работы с помощью
time.Sleep.
- Использует
-
Ожидание завершения: После запуска всех горутин,
wg.Wait()блокирует выполнение основной горутины до тех пор, пока счетчик не станет равным нулю, то есть пока все горутины не вызовутDone().
Зачем это нужно
WaitGroup полезен, когда необходимо дождаться завершения нескольких параллельных задач перед продолжением выполнения программы. Это позволяет избежать преждевременного завершения программы или выполнения кода, который зависит от результатов работы горутин.
🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!
Подписаться