【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()

}
广告
将在 10 秒后关闭
bannerAds