Files
go_playground/5-go-by-example/36-wait-group.go
2022-01-11 14:50:17 +01:00

38 lines
783 B
Go

// wait for multiple goroutines to finish
package main
import (
"fmt"
"sync"
"time"
)
// function to run in every goroutine
func worker(id int) {
fmt.Printf("Worker %d starting\n", id)
time.Sleep(time.Second)
fmt.Printf("Worker %d done\n", id)
}
func main() {
// WaitGroup is used to wait for all the goroutines launched here to finish
var wg sync.WaitGroup
// Launch several goroutines and increment the WaitGroup counter for each
for i := 1; i <= 5; i++ {
wg.Add(1)
// Avoid re-use of the same i value in each goroutine closure
i := i
// Wrap the worker call in a closure that makes sure to tell the WaitGroup that this worker is done
go func() {
defer wg.Done()
worker(i)
}()
}
// Block until the WaitGroup counter goes back to 0
wg.Wait()
}