goroutineは、プログラムの並行処理を実現します。
goroutineはマルチスレッドのようなもので、
goroutineの起動毎に回路が作られ、その中で処理が行われます。
起動方法は、次の通りです。
go 関数(またはメソッド)
以降に記述された処理が、goと記載された処理の終了をまたずに起動されます。
goroutineを複数起動することもできます。
次の処理に対して、goroutineの終了を待たせたい場合には、
syncパッケージのWaitGroup構造体を使用します。
WaitGroupはgoroutineの個数を管理し、次のメソッドを持ちます。
func (wg *sync.WaitGroup).Add(delta int) // 管理する個数をdelta分だけ増やす func (wg *sync.WaitGroup).Done() // その処理の完了を表し、管理する個数から-1する func (wg *sync.WaitGroup).Wait() // 管理する個数が0になるまで、次の処理をブロックする
各メソッドには、WaitGroupのポインタを渡す必要があります。
使用例を示します。
func ex(wg *sync.WaitGroup) {
defer wg.Done() // 処理が完了したことを告げ、管理する個数から-1する
for i := 0; i < 5; i++ {
fmt.Println("!")
}
}
func world(wg *sync.WaitGroup) {
defer wg.Done() // 処理が完了したことを告げ、管理する個数から-1する
for i := 0; i < 5; i++ {
fmt.Println("world")
}
}
func hello() {
for i := 0; i < 5; i++ {
fmt.Println("hello")
}
}
func main() {
var wg sync.WaitGroup
wg.Add(2)
go ex(&wg) // アドレス(ポインタ)を渡す
go world(&wg) // アドレス(ポインタ)を渡す
hello()
wg.Wait()
fmt.Println("finish!") // wgの完了を待つ
}
helloが5回、worldが5回、!が5回出力された後、finish!が出力されます。
(hello、world、!の順番が入れ替わることがあります。)