GoroutineとChannelまとめ
1900 ワード
Golangの同時サポートは比較的簡単で、Goroutineのメカニズムを採用しており、協程に似ています.
Goキーワードで実現できます.
以上のコードの出力を当ててみたら、何も出力されませんでした.なぜか、私はgoで10個の同時協力を開いたのに、どうして何も出力しないのですか.
理由:forループが終わるとmainメソッドは終了します.この時点でプログラムはすべてのリソースを解放します.したがってgoで作成された同時funcは実行されません.
まずsyncを紹介します.WaitGroup、クリックしてドキュメントを見ることができます.
このように書く目的はmainメソッドをブロックさせることです.出力はランダムになります.どのスレッドが先に終わるか分からないからです.
GOMAXPROCSドキュメントGoexitドキュメント
Channelの設計はGoruntineの直接的な通信を実現するためである.特筆すべきはチャネルが値タイプである点で注意が必要である.
これによりchennel伝達メッセージが実現される.
以上の内容に誤りがあれば、指摘してください.
Go学習ノート第四版雨痕Go中国語ドキュメント
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中国語ドキュメント