導入
goroutine(ゴルーチン) は「軽量な処理の並行実行単位」です。関数の呼び出しに go を付けるだけで、その処理を別の流れで同時に走らせられます。
説明
package main
import (
"fmt"
"time"
)
func task(name string) {
for i := 1; i <= 3; i++ {
fmt.Println(name, i)
time.Sleep(100 * time.Millisecond)
}
}
func main() {
go task("A") // 別の流れで実行(すぐ次の行へ進む)
task("B") // こちらは通常どおり実行
time.Sleep(500 * time.Millisecond) // A が終わるのを少し待つ
}
go task("A")…taskを goroutine として起動。mainは完了を待たずに次へ進みます。- そのため
AとBの出力は入り混じって表示されます。 - goroutine は数千個作っても軽い(OS のスレッドより小さい)のが Go の強みです。
注意:main 関数が終わると、走っている goroutine も強制的に打ち切られます。上の例で time.Sleep を入れているのは、A が終わるのを待つための一時しのぎです(次のレッスンで、待つための正しい方法を学びます)。
やってみよう
go task("A") から go を外すと、A → B の順に整列して実行されます。go を付けると同時に走り、出力が混ざる――この違いが並行処理の入り口です。