Channel Synchronization

Channel Synchronization #

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

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` が
# 起動するより早くプログラムが終了してしまうかもしれない。