← Назад ко всем вопросам

Что такое 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")
}

Объяснение кода

  1. Создание WaitGroup: В main создается переменная wg типа sync.WaitGroup. Это объект, который будет отслеживать количество активных горутин.

  2. Запуск горутин: В цикле for запускается 5 горутин. Для каждой из них:

    • Вызывается wg.Add(1), чтобы увеличить счетчик активных горутин на 1.
    • Запускается функция worker в отдельной горутине, которой передается идентификатор и указатель на wg.
  3. Функция worker:

    • Использует defer wg.Done(), чтобы гарантировать вызов Done() при завершении работы горутины, уменьшая счетчик на 1.
    • Симулирует выполнение работы с помощью time.Sleep.
  4. Ожидание завершения: После запуска всех горутин, wg.Wait() блокирует выполнение основной горутины до тех пор, пока счетчик не станет равным нулю, то есть пока все горутины не вызовут Done().

Зачем это нужно

WaitGroup полезен, когда необходимо дождаться завершения нескольких параллельных задач перед продолжением выполнения программы. Это позволяет избежать преждевременного завершения программы или выполнения кода, который зависит от результатов работы горутин.

Тема: Конкурентность
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки