GoroutineとChannelまとめ

1900 ワード

Golangの同時サポートは比較的簡単で、Goroutineのメカニズムを採用しており、協程に似ています.
Goキーワードで実現できます.

Goroutineベース


第一のケース

func main() {
    for i := 0; i < 10; i++ {
        go func(i int) {
            fmt.Println(i)

        }(i)
    }
}

以上のコードの出力を当ててみたら、何も出力されませんでした.なぜか、私はgoで10個の同時協力を開いたのに、どうして何も出力しないのですか.
理由:forループが終わるとmainメソッドは終了します.この時点でプログラムはすべてのリソースを解放します.したがってgoで作成された同時funcは実行されません.

2つ目のケース

func main() {
    wg := new(sync.WaitGroup)
    wg.Add(10)
    for i := 0; i < 10; i++ {
        go func(i int) {
            defer wg.Done()
            fmt.Println(i)

        }(i)
    }
    wg.Wait()
}

まずsyncを紹介します.WaitGroup、クリックしてドキュメントを見ることができます.
wg.Add(delta int) 。
wg.Done() Done WaitGroup , 。
wg.Wait() Wait WaitGroup 0。

このように書く目的はmainメソッドをブロックさせることです.出力はランダムになります.どのスレッドが先に終わるか分からないからです.

追加runtimeメソッド

func main() {
    runtime.GOMAXPROCS(2)
    wg := new(sync.WaitGroup)
    wg.Add(10)
    for i := 0; i < 10; i++ {
        go func(i int) {
            defer wg.Done()
            if i == 3 {
                runtime.Goexit()
            }
            fmt.Println(i)

        }(i)
    }
    wg.Wait()
}

GOMAXPROCSドキュメントGoexitドキュメント
runtime.GOMAXPROCS(2) OMAXPROCS CPU , 。
runtime.Goexit() Goexit go 。 go 。Goexit go defer 。

Goroutine通信-->Channel


Channelの設計はGoruntineの直接的な通信を実現するためである.特筆すべきはチャネルが値タイプである点で注意が必要である.
// 
chan = make(chan int)
 channel goroutine 
func main() {
    runtime.GOMAXPROCS(4)
    ch := make(chan int)
    go add(1, 2, ch)
    go printAaddB(ch)
}

func add(a int, b int, ch chan int) {
    ch 

これによりchennel伝達メッセージが実現される.

リファレンス


以上の内容に誤りがあれば、指摘してください.
Go学習ノート第四版雨痕Go中国語ドキュメント