#【Golang】ゴルーチン(並行処理)
Golangの基礎学習〜Webアプリケーション作成までの学習を終えたので、復習を兼ねてまとめていく。 基礎〜応用まで。
package main
//goroutineとsync.WaitGroup
//goroutinの基礎
//軽量のスレッド 並列処理のこと
//暗黙的にGoはやってくれるため、他の言語ほど深い知識がなくても
//勝手にやってくれる
import (
"fmt"
"sync"
"time"
"runtime"
)
//並列処理
//3
//引数でポインタを宣言
func goroutin(wg *sync.WaitGroup){
//3
//wgを終了する
defer wg.Done()
for i := 0; i < 5; i++ {
time.Sleep(100 * time.Millisecond)
fmt.Println(i)
}
}
/*
wg.doneが無かったり、wg.Add(1)が複数あるとエラーになる。
*/
//1
//通常の処理
func normal(){
for i := 1; i < 5; i++ {
//1秒待つ
time.Sleep(1000 * time.Millisecond)
fmt.Println(i)
}
}
func main() {
/*
//1
//通常の処理
normal()
//2
//関数の前に go を書くだけで並列化できる。
//関数内のtime.sleepを消すと、並列処理のスレッド生成中にループが終了してしまうため、
//normalが終わったら、終了してしまう為、goroutinは実行されない。
//time.sleep(2000 * time.Millisecond)で時間を開けると、実行を確認できる。
go goroutin()
go goroutin()
*/
//3
//上記を防ぐ
//sync.WaitGroupを宣言
var wg sync.WaitGroup
//並列処理が1つあることを設定する。
wg.Add(2)
//引数でwgのアドレスを渡す
go goroutin(&wg)
go goroutin(&wg)
//NumCPU Goランタイムが動作する環境のCPUを表す。使用できるCPUのコア数。
fmt.Printf("CPU: %d\n", runtime.NumCPU())
//NumGoroutin Goのランタイム上で動作しているゴルーチンの数を表す
fmt.Printf("NumGoroutin: %d\n", runtime.NumGoroutine())
//Version Goのバージョン
fmt.Printf("Version: %s\n", runtime.Version())
//通常
normal()
//wg,Doneが行われるまで、待ってくれる
wg.Wait()
}