Goの大きな特徴の1つが**goroutine(ゴルーチン)**です。
goを付けるだけで、関数を別の処理として同時に動かせます。
1. goroutineとは?
goroutine は 軽量スレッドのような仕組みです。
go を付けて関数を呼ぶと、その関数は 別のgoroutineとして実行されます。
go sub()
2.基本形
package main
import "fmt"
func sub() {
i := 0
for {
fmt.Println(i) // 0,1,2,3,...(無限)
i++
}
}
func main() {
go sub()
for {
fmt.Println("main") // main, main, main...(無限)
}
}
実行するとどうなる?
-
sub()が別goroutineで動き始める -
main()側も無限に"main"を出す - その結果、出力は 混ざる(順序は保証されない)
出力例(あくまで一例):
main
0
main
1
2
main
main
3
...
ポイント
- どの順番で出るかは決まっていない
- 実行のタイミングはスケジューラ次第
3. 無名関数をgoroutineにする(go func)
goroutineにする関数は、名前付き関数だけでなく 無名関数でもOKです。
go func() {
i := 0
for {
fmt.Println(i) // 0,1,2,3,...(無限)
i++
}
}()
これも go sub() と同じく、並行に動きます。
4. goroutineはmainが終わると止まる
goroutineは勝手に生き続けるわけではなく、main関数が終了するとプログラムごと終了します。
つまり main が先に終わるコードだと、goroutineが動く前に終了することもあります。
5.CPU数 / goroutine数を確認する方法
import (
"fmt"
"runtime"
)
fmt.Printf("CPU数: %d\n", runtime.NumCPU())
fmt.Printf("Goroutine数: %d\n", runtime.NumGoroutine())
fmt.Printf("Version: %s\n", runtime.Version())
6.まとめ
-
goを付けると関数が goroutine として並行実行される - 出力順序は保証されない(混ざる)
-
mainが終了すると goroutine もまとめて終了する -
runtimeで CPU 数や goroutine 数を確認できる
参考