LoginSignup
0
0

More than 3 years have passed since last update.

【Golang】ゴルーチン(並行処理)

Posted at

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

}
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