LoginSignup
1
1

【Golang】Goroutineについて

Posted at

image.png

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秒かかりました。

image.png

次にGoroutineを使って実装してみます。

2つのgroutineを作成し、syncpackageの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の出力の方が先にきていることも注目ポイントです。

図で表してみるとこんなイメージでしょうか。

image.png

このように、Goroutineを用いることで並列処理を簡単に実装することができ、アプリケーションの効率を向上させることができます。

まとめ

  • GolangGoroutineを使うと、軽量な並列処理が簡単に実装でき、
    実行効率を向上させることができる。
  • go func(){}()という風に書くだけでGoroutineを実装することが可能
  • sync packageのWaitGroupを使うと、複数のGoroutineを作成し、全てのGoroutineの完了まで待つことが可能
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1