sync.WaitGroupの使い方

created byTakuya Ueda. Licensed under the Creative Commons 3.0 Attributions license.

こんにちはnasustです。 goroutineの並列処理で、それら全ての終了を待つ場合は、sync.WaitGroupを使用します。

sync.WaitGroupのメソッド

sync.WaitGroupは複数のgoroutineの処理を纏めて待機する機能があります。Addメソッドでgroutineの数をカウントして、スレッド側でDoneメソッドのカウントを減らします。Waitメソッドはカウントが0になるまで待機します。

Add

func  (wg *WaitGroup) Add(delta) int
go

deltaの数だけ、WaitGroupのカウンータに加算します。

Done

func (wg *WaitGroup) Done
go
WaitGroupのカウンターを1引きます。

Wait

WaitGroupのカウンターが0になるまで待機します。

サンプル

package main

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

func main() {
	var wg sync.WaitGroup

	for i := 0; i < 10; i++ {
		wg.Add(1)
		go func(sleep time.Duration) {
			defer wg.Done()

			fmt.Println("sleep: ", sleep*time.Second)
			time.Sleep(sleep * time.Second)
		}(time.Duration(i + 1))
	}
	wg.Wait()
	fmt.Println("exit wait group")
}
go

最後に

sync.WaitGroupを使用することで簡単にWorkerが実装できます。Go言語ではシンプルに同期できるのが素晴らしいですね。

prevnext