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

Что такое WaitGroup в Go и для чего он используется?

Sobes Copilot

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

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

sobes.tech AI

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

Используется для:

  • Ожидания завершения всех горутин перед выходом из функции или программы.
  • Координации работы между несколькими горутинами.

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

package main

import (
	"fmt"
	"sync"
	"time"
)

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
	numWorkers := 3

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

	wg.Wait() // Блокируем выполнение main до тех пор, пока счетчик не станет равен 0
	fmt.Println("Все рабочие закончили работу")
}

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

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