Go by Example: Goroutines

ゴルーチン (goroutine) は、軽量スレッドです。

package main
import (
    "fmt"
    "time"
)
func f(from string) {
    for i := 0; i < 3; i++ {
        fmt.Println(from, ":", i)
    }
}
func main() {

関数呼び出し f(s) があるとしましょう。 通常の方法で呼び出すと、同期的に実行されます。

    f("direct")

この関数をゴルーチンとして呼び出すには、 go f(s) とします。この新しいゴルーチンは、 実行元とは並行して実行されます。

    go f("goroutine")

無名関数に対してゴルーチンを開始することもできます。

    go func(msg string) {
        fmt.Println(msg)
    }("going")

上の 2 つの関数呼び出しは別々のゴルーチンで非同期に 実行されるので、プログラムの実行はすぐにここへきます。 それらが完了するまで待ちます(より堅牢な方法としては、 WaitGroup を使ってください)。

    time.Sleep(time.Second)
    fmt.Println("done")
}

このプログラムを実行すると、最初に同期呼び出しの出力、 その次に 2 つのゴルーチンの出力を確認できます。 ゴルーチンは Go ランタイムによって並行実行されるため、 これらの出力は交互になる可能性があります。

$ go run goroutines.go
direct : 0
direct : 1
direct : 2
goroutine : 0
going
goroutine : 1
goroutine : 2
done

次回は、Go の並行プログラムを補完するチャネルを見ていきます。

Next example: Channels.