サンプルで学ぶ Go 言語:Channel Synchronization

チャネルを使ってゴルーチン間を同期できる。 この例では、ゴルーチンが処理を終えるのを待つために、受信がブロックされることを利用する。 複数のゴルーチンが処理を終えるのを待つときは WaitGroup を使う方が好ましいだろう。

package main
import (
    "fmt"
    "time"
)

この関数をゴルーチンで実行する。 done チャネルはこの関数の仕事が終わったことを、別のゴルーチンに知らせるために使う。

func worker(done chan bool) {
    fmt.Print("working...")
    time.Sleep(time.Second)
    fmt.Println("done")

終わったことを知らせるために値を送信する

    done <- true
}

通知用のチャネルを渡してゴルーチンを起動する。

func main() {
    done := make(chan bool, 1)
    go worker(done)

ワーカーからこのチャネルに通知が届くまでブロックされる。

    <-done
}
$ go run channel-synchronization.go      
working...done                  

このプログラムから <- done を除くと、worker が 起動するより早くプログラムが終了してしまうかもしれない。

次の例:Channel Directions