例でわかる Go: ゴルーチン

ゴルーチンは軽量の執行スレッドです。

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 プログラムにおけるゴルーチンの補完について見ていきます。チャネルです。

次の例: チャネル