Sobes.tech
Junior
258

Для чего используется WaitGroup в Go?

AI-дан жауап

sobes.tech AI

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

Основные методы:

  • Add(delta int): Увеличивает или уменьшает счетчик горутин.
  • Done(): Уменьшает счетчик на 1. Обычно вызывается в конце горутины (часто с использованием defer).
  • Wait(): Блокирует выполнение до тех пор, пока счетчик не станет равным нулю.

Пример использования:

package main

import (
	"fmt"
	"sync"
)

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

	for i := 1; i <= 5; i++ {
		wg.Add(1) // Увеличиваем счетчик для каждой горутины
		go worker(i, &wg) // Запускаем горутину, передавая указатель на WaitGroup
	}

	wg.Wait() // Ждем, пока счетчик не станет 0 (все горутины завершатся)
	fmt.Println("Все горутины завершены")
}