sync.WaitGroup
ゴルーチンの終了待ちには、チャネルを使うほかに sync パッケージの WaitGroup を使う方法もある。
使い方はこうだ:
sync.WaitGroupの変数を作る- その変数に、終了待ちをするゴルーチンの数を設定する
- ゴルーチンを呼び出す。このとき、
sync.WaitGroupの変数を渡す - ゴルーチン側では、終了したら
Done関数を呼ぶ - メインルーチン側で、
Wait関数を呼ぶ
実際に試してみよう。
package main
import (
"fmt"
"time"
"sync"
)
func test(n int, name string, wg *sync.WaitGroup) {
for i := 0; i < n; i++ {
fmt.Println(i, name)
time.Sleep(500 * time.Millisecond)
}
wg.Done()
}
func main() {
var wg sync.WaitGroup wg.Add(3)
go test(6, "foo", &wg)
go test(4, "bar", &wg)
go test(8, "baz", &wg) wg.Wait()
}
^o^ > go run go_waitgroup.go
0 baz
0 bar
0 foo
1 baz
1 bar
1 foo
2 baz
2 bar
2 foo
3 baz
3 bar
3 foo
4 baz
4 foo
5 baz
5 foo
6 baz
7 baz
