Go podle Příkladů: Čekání na skupiny s WaitGroup

Pro čekání na dokončení několika gorutin můžeme použít wait group.

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

Toto je funkce, která poběží v každé gorutině.

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

Čekáme abychom simulovali dlouhý úkol.

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

Tato čekací skupina (WaitGroup) je použita pro čekání na ukončení všech gorutin zde nastartovaných. Pozn.: pokud WaitGroup explicitně předáváte do funkcí, mělo by to být jako ukazatel.

    var wg sync.WaitGroup

Nastartujeme několik gorutin pomocí WaitGroup.Go.

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

Blokujeme, dokud nejsou hotové všechny gorutiny nastartované pomocí wg. Gorutina je hotová, když se funkce, kterou volá, vrátí.

    wg.Wait()

Všimněte si, že tento přístup nenabízí přímočarý způsob, jak předat chyby z pracovních rutin. Pro pokročilejší případy použití zvažte balíček errgroup.

}
$ go run waitgroups.go
Worker 5 startuje
Worker 1 startuje
Worker 2 startuje
Worker 3 startuje
Worker 4 startuje
Worker 1 končí
Worker 5 končí
Worker 4 končí
Worker 3 končí
Worker 2 končí

Pořadí startujících a končících rutin bude pravděpodobně jiné při každém spuštění.

Další příklad: Omezování rychlosti (rate limiting).