GoのGoroutineの使用

3252 ワード

同時concurrency

  • Goroutineは、
  • を共有するのではなく、通信によってメモリを共有する.
  • ChannelはGoroutineのコミュニケーションブリッジであり、参照タイプは、ほとんどがブロック同期の
  • である.
  • make作成、close閉じる
  • for range反復操作channelは、一方向または双方向のパイプを設定することができ、キャッシュサイズは、満たす前に
  • を塞ぐことなく設定することができる.
  • Select
  • は、1つまたは複数のチャネルの送受信
  • を処理することができる.
  • は同時に複数の使用可能なchnnelランダムシーケンス処理
  • を有する.
  • 空のselectブロックmain関数を設定でき、タイムアウト
  • を設定できます.
  • 一方向配管chan
  • func initV(out chan

    chan非同期処理サイクル印刷

    func ChanRange(index int,c chan bool) {
        a := 0
        for i := 0; i < 100000000; i++ {
            a += i
        }
        fm.Println("a value is:",index, a)
        c

    sync非同期サイクル印刷

    func SyncRange(index int,wg *sync.WaitGroup) {
        a := 0
        for i := 0; i < 100000000; i++ {
            a += i
        }
        fm.Println("a value is:",index, a)
        wg.Done()// , 
    }
    
    func goSync() {// 
        //runtime.GOMAXPROCS(runtime.NumCPU())/ cpu 
        wg:=sync.WaitGroup{}
        wg.Add(10)
        for i := 0; i < 10; i++ {
            go my.SyncRange(i,&wg)
        }
        wg.Wait()
    
    }
    

    コンカレントはパラレルではありません==古いバージョンのデフォルト=、Goのすべてのgoroutinesは1つのスレッドでしか走ることができません。つまり、コア数を1に設定すると、goChanメソッドはパラレルではありません。コンカレントです==新しいバージョンのデフォルト==runtime.GOMAXPROCS(runtime.NumCPU())が最大に設定されている場合、彼はパラレルです。

  • の2つのキュー、1つのCoffeeマシン、それは同時
  • です.
  • 2 2つのキュー、2つのCoffeeマシン、それは並列
  • です.
    package main
    
    import (
        "fmt"
    )
    
    func say(s string) {
        for i := 0; i < 5; i++ {
            fmt.Println(s)
        }
    }
    
    func main() {
        go say("world") // Goroutines 
        for {
        }
    }
    

    ここでGoはまだシングルコアを使用しており、forデッドサイクルはシングルコアCPUのすべてのリソースを占めているが、main線とsayの2つのgoroutineは1つのスレッドの中にあるため、sayは実行する機会がない。

  • Go使用可能マルチコア(runtime.GOMAXPROCS)
  • 手動でruntimeパッケージ(runtimeパッケージはgoroutineのスケジューラ)、
  • を明示的に動かす
  • Goschedはcpu
  • を譲る
  • NumCPUは、現在のシステムのCPUコア数
  • を返す.
  • GOMAXPROCS最大同時使用可能CPUコア数
  • を設定
  • Goexit現在のgoroutineを終了(ただしdefer文は通常通り実行)
  • func loop() {
        for i := 0; i < 10; i++ {
            runtime.Gosched() //  CPU goroutine
            fmt.Printf("%d ", i)
        }
        quit 

    -上のコードのようなCPU時間をアクティブに与える方法は、依然としてシングルコアで走っています。しかし、goroutineを手動で切り替えると、見た目の「並列」になります。stackoverflowの説明:https://stackoverflow.com/questions/13107958/what-exactly-does-runtime-gosched-do


    goroutineがブロックされると、Goは、goroutineと同じシステムスレッドにある他のgoroutinesを自動的に別のシステムスレッドに移行し、これらのgoroutinesがブロックされないようにします。すなわち、goroutineがブロックされずCPUを解放しません。

    package main
    
    import (
        "fmt"
        "runtime"
    )
    
    var quit chan int = make(chan int)
    
    func loop(id int) { // id:  goroutine 
        for i := 0; i < 10; i++ { // 10 goroutine 
            fmt.Printf("%d ", id)
        }
        quit 

    selectの使用

  • マルチchan処理
  • func TwoMoreChan() {
        c1, c2 := make(chan bool), make(chan int)
        o := make(chan bool)
    
        go func() {
            for {
                select {
                case v, ok := 
  • 設定タイムアウト処理
  • func SelectTime() {
        c := make(chan bool)
        select {
        case v :=