Go на примерах: WaitGroups

Для ожидания завершения нескольких горутин можно использовать wait group.

package main
import (
    "fmt"
    "sync"
    "time"
)

Эта функция будет выполняться в каждой горутине.

func worker(id int) {
    fmt.Printf("Worker %d starting\n", id)

Имитируем ресурсоёмкую задачу с помощью Sleep.

    time.Sleep(time.Second)
    fmt.Printf("Worker %d done\n", id)
}
func main() {

WaitGroup используется для ожидания завершения всех запущенных здесь горутин. Примечание: если WaitGroup явно передаётся в функции, это нужно делать по указателю.

    var wg sync.WaitGroup

Запускаем несколько горутин с помощью WaitGroup.Go

    for i := 1; i <= 5; i++ {
        wg.Go(func() {
            worker(i)
        })
    }

Блокируемся до завершения всех горутин, запущенных через wg. Горутина считается завершённой, когда вызванная в ней функция возвращает управление.

    wg.Wait()

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

}
$ go run waitgroups.go
Worker 5 starting
Worker 3 starting
Worker 4 starting
Worker 1 starting
Worker 2 starting
Worker 4 done
Worker 1 done
Worker 2 done
Worker 5 done
Worker 3 done

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

Далее: .