読者です 読者をやめる 読者になる 読者になる

Go言語入門 / golang入門 sync.WaitGroupの使い方

Go言語 / golang プログラミング Go言語入門 / golang 入門

f:id:nasust:20161122141513p:plain The Go gopher was designed by Renee French. (http://reneefrench.blogspot.com/) CC3.0



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

sync.WaitGroupのメソッド

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

Add

func  (wg *WaitGroup) Add(delta) int

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

Done

func (wg *WaitGroup) Done

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")
}

最後に

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

Go言語 / golang 入門 目次に戻る

広告を非表示にする