Go言語のgoroutineとは?並行処理の基本をやさしく解説
生徒
「先生、Go言語の“並行処理”ってよく聞くんですが、どういうことなんですか?」
先生
「良い質問ですね。Go言語には“goroutine(ゴルーチン)”という仕組みがあり、これを使うと複数の処理を同時に実行できるんですよ。」
生徒
「複数の処理を同時に?なんだか難しそうです……」
先生
「心配しなくて大丈夫です。Go言語の並行処理は、他の言語と比べてもとても簡単に書けるのが特徴なんですよ。それでは、実際にgoroutineの基本から学んでいきましょう!」
1. goroutine(ゴルーチン)とは?
Go言語のgoroutineとは、軽量なスレッド(並行処理の単位)のことです。通常、プログラムは上から順に1つずつ命令を実行しますが、goroutineを使うと、複数の処理を同時に進めることができます。
たとえば、料理で「ご飯を炊く」と「お味噌汁を作る」を同時に進めるようなイメージです。どちらも終わるのを待たずに、同時並行で作業できるのが“並行処理”です。
Go言語では、関数の前にgoというキーワードを付けるだけで、その関数を別のgoroutineとして実行できます。
package main
import (
"fmt"
"time"
)
func printMessage(msg string) {
for i := 0; i < 3; i++ {
fmt.Println(msg)
time.Sleep(time.Millisecond * 500)
}
}
func main() {
go printMessage("こんにちは、goroutine!")
printMessage("メイン関数からのメッセージ")
}
上の例では、printMessage関数をgoキーワード付きで呼び出しています。これにより、「こんにちは、goroutine!」の処理と「メイン関数からのメッセージ」の処理が同時に実行されます。
2. 実行結果を確認してみよう
実際にこのプログラムを実行すると、出力が交互に表示されることがあります。これは、2つの処理が同時に動いているためです。
メイン関数からのメッセージ
こんにちは、goroutine!
メイン関数からのメッセージ
こんにちは、goroutine!
メイン関数からのメッセージ
こんにちは、goroutine!
実行の順番は毎回少しずつ変わることがあります。これは、どちらの処理が先に進むかをGoのランタイム(プログラムを実行する仕組み)が自動で調整しているためです。
3. goroutineの注意点
goroutineはとても便利ですが、1つ注意点があります。メイン関数が終了すると、すべてのgoroutineも強制的に終了してしまうという点です。
上の例では、time.Sleep()で少し待つことで、goroutineが実行を終える時間を確保しています。しかし、メイン関数が早く終わると、goroutineの処理が途中で止まることもあります。
そのため、複数のgoroutineを確実に完了させたい場合は、後ほど紹介するsync.WaitGroupという仕組みを使うのが一般的です。
4. goroutineを使うメリット
Go言語でgoroutineを使うと、次のようなメリットがあります。
- ① 高速な並行処理が簡単にできる – Goはスレッドの管理を自動で行うため、初心者でも複雑な設定をせずに並行処理ができます。
- ② メモリの使用が少ない – 通常のスレッドよりも軽量なので、大量のgoroutineを同時に動かすことが可能です。
- ③ シンプルな構文 – 関数の前に
goを付けるだけで並行処理が実現します。
例えば、Webサーバーを作る場合、複数のユーザーから同時にリクエストが来ても、それぞれを別のgoroutineで処理できるため、処理が止まらずにスムーズに動作します。
5. goroutineとchannelの関係
並行処理を行うと、複数のgoroutineが同時に動くため、「どうやってデータをやり取りするのか?」という問題が出てきます。
このときに使うのがchannel(チャネル)です。channelは、goroutine間でデータを送受信するための“パイプ”のような仕組みです。
package main
import "fmt"
func main() {
ch := make(chan string)
go func() {
ch <- "データを送ります!"
}()
msg := <-ch
fmt.Println(msg)
}
このコードでは、chというチャネルを作り、別のgoroutineから文字列を送信しています。そして、メイン関数でそのデータを受信して出力します。これにより、複数のgoroutineが安全にデータをやり取りできるようになります。
6. goroutineの実践的なイメージ
goroutineは、まるで「複数の人が同時に仕事を進めるチーム」のようなものです。1人で全てを順番にやるよりも、複数人で分担した方が早く終わりますよね。
ただし、誰が何をしているかを共有しないと混乱してしまいます。これを助けるのが「channel(情報共有の仕組み)」というわけです。
このように、goroutineとchannelを組み合わせることで、Go言語では効率的で安全な並行処理が簡単に書けます。