Go言語には「ゴルーチン」という、かっこいい名前の機能があります。
そもそもGoは並列処理が得意と言われていますが、その並列処理を簡単にしてくれるのがゴルーチンです。
ってことで今回は、Go言語のゴルーチンに入門してみました。
僕のプロフィールはこちら
今回のソースコード
■GitHub
URL:「https://github.com/izumin0401/go-lang/blob/master/goroutine/goroutine.go」
まずはゴルーチンを使用せずに実行してみる
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
package main import ( "log" "strconv" "time" ) // スリープさせる func sleep(i int) { log.Print(strconv.Itoa(i + 1) + "回目") time.Sleep(1 * time.Second) } // メイン関数 func main() { const sleepSecondTime int = 3 log.Print("start") for i := 0; i < sleepSecondTime; i ++ { sleep(i) } log.Print("end") } |
処理を1秒間停めるsleep関数を3回呼んでいるだけです。
1 2 3 4 5 6 |
Desktop\git\go-lang\goroutine> go run .\main.go 2020/03/21 02:11:06 start 2020/03/21 02:11:06 1回目 2020/03/21 02:11:07 2回目 2020/03/21 02:11:08 3回目 2020/03/21 02:11:09 end |
ログを見た感じ、ちゃんと3秒かかっていますね。
ゴルーチンを使用して実行してみる
ゴルーチンを使用するには、関数呼び出し時に「go」を指定するだけです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
package main import ( "log" "strconv" "time" ) // スリープさせる func sleep(i int) { log.Print(strconv.Itoa(i + 1) + "回目") time.Sleep(1 * time.Second) } // メイン関数 func main() { const sleepSecondTime int = 3 log.Print("start") for i := 0; i < sleepSecondTime; i ++ { go sleep(i) // ゴルーチン使用 } log.Print("end") } |
sleep関数を、ゴルーチンを使用して呼び出します。
1 2 3 |
Desktop\git\go-lang\goroutine> go run .\main.go 2020/03/21 02:13:50 start 2020/03/21 02:13:50 end |
実行すると、あら不思議。
sleep関数を呼んだ形跡が全くない。。
ゴルーチンの注意点
ゴルーチンを使用した場合、main関数の処理が終われば自動的にすべての処理が終了します。
今回の例だと、ゴルーチンを使用したことで、sleep関数はmain関数の管理下ではなくなったイメージになります。
これはチャネルを使うなどして回避できますが、今回はゴルーチンをいい感じに使ってみたいだけなので、一旦main関数の最後にsleep関数を仕込んでみます。
ゴルーチンを使用して再度実行してみる
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
package main import ( "log" "strconv" "time" ) // スリープさせる func sleep(i int) { log.Print(strconv.Itoa(i + 1) + "回目") time.Sleep(1 * time.Second) } // メイン関数 func main() { const sleepSecondTime int = 3 log.Print("start") for i := 0; i < sleepSecondTime; i ++ { go sleep(i) // ゴルーチン使用 } time.Sleep(4 * time.Second) log.Print("end") } |
多めですが、一旦4秒スリープさせました。
1 2 3 4 5 6 |
Desktop\git\go-lang\goroutine> go run .\main.go 2020/03/21 02:18:51 start 2020/03/21 02:18:51 1回目 2020/03/21 02:18:51 3回目 2020/03/21 02:18:51 2回目 2020/03/21 02:18:55 end |
main関数で多めに4秒停めているので全体は4秒かかっていますが、sleep関数はゴルーチンを使用したので、すべて51秒のタイミングで並列実行されています。
つまり、ゴルーチンを使用したことで並列処理が行われていることが確認できたわけです。
おわり。
おすすめ本
これおすすめやで。
まとめ
ゴルーチンを使ったのは、ゴルーチンっていう名前がカッコよかったっていうだけです。
で、使ってみて分かったんですが、これ意外と便利ですね。
「そもそも前処理待たなくてよくね?」みたいなケースってぼちぼちありますからね。
次はチャネルとか使ってみようかなと思いまする。
関連記事
以下の記事も合わせて読まれています。