0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Goのgoroutineを理解する

0
Posted at

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 数を確認できる

参考

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?