Назад к вопросам
Junior
117
questionbank

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

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

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("Все горутины завершены")
}