Goroutine
とても簡単に言うと、Goroutine (ゴルーチン)
とは、Go言語で並列処理を簡単に実現するためのものです。
参考)
並列処理を適切に実装することで実行効率が良くなります。
具体的には、複数のCPUを利用してタスクを分散することで、全体の処理速度を高めることができます。
3秒かかる処理A
と、2秒かかる処理B
の2つを実装してみましょう。
まずは、Goroutine
を使わずに直列で実装します。
main.go
// 3秒かかる処理
func A() {
time.Sleep(3 * time.Second)
println("A")
}
// 2秒かかる処理
func B() {
time.Sleep(2 * time.Second)
println("B")
}
func main() {
A()
B()
}
実行し、時間を計測してみます。
$ time go run main.go
A
B
real 0m5.078s
user 0m0.054s
sys 0m0.064s
予想通り5秒かかりました。
次にGoroutineを使って実装してみます。
2つのgroutineを作成し、sync
packageのwaitGroup
を使いそれぞれのgoroutineが終了するまで待つようにしてみます。
func A(waitGroup *sync.WaitGroup) {
defer waitGroup.Done()
time.Sleep(3 * time.Second)
println("A")
}
func B(waitGroup *sync.WaitGroup) {
defer waitGroup.Done()
time.Sleep(2 * time.Second)
println("B")
}
func main() {
var waitGroup sync.WaitGroup
// 2つのgoroutineを設定
waitGroup.Add(2)
go A(&waitGroup)
go B(&waitGroup)
// すべてのgoroutineの終了を待つ
waitGroup.Wait()
}
こちらも実行して計測してみます。
time go run main.go
B
A
real 0m3.067s
user 0m0.030s
sys 0m0.076s
3秒しかかからなくなりました。
そして、Bの出力の方が先にきていることも注目ポイントです。
図で表してみるとこんなイメージでしょうか。
このように、Goroutineを用いることで並列処理を簡単に実装することができ、アプリケーションの効率を向上させることができます。
まとめ
-
Golang
のGoroutine
を使うと、軽量な並列処理が簡単に実装でき、
実行効率を向上させることができる。 -
go func(){}()
という風に書くだけでGoroutineを実装することが可能 -
sync
packageのWaitGroup
を使うと、複数のGoroutine
を作成し、全てのGoroutine
の完了まで待つことが可能