Go 言語の同時実行機能の分析
Go 言語は、Google によって開発されたオープンソース プログラミング言語であり、同時プログラミングの処理において独自の利点があります。 Go 言語は、そのシンプルさ、効率性、強力な同時実行メカニズムにより、開発者の間でますます好まれています。この記事では、ゴルーチン、チャネル、同時実行プリミティブなどの Go 言語の同時実行機能を深く調査し、特定のコード例を使用して分析します。
1. Goroutine
Go 言語では、Goroutine は同時実行の基本単位であり、スレッドに似ていますが、スレッドよりも軽量です。 goroutine は go キーワードを使用して開始されます。これにより、システム リソースを枯渇させることなく、プログラム内で同時に実行するための数千の goroutine を作成できます。
以下は簡単なゴルーチンの例です:
package main import ( "fmt" "time" ) func sayHello() { for i := 0; i < 5; i++ { fmt.Println("Hello") time.Sleep(100 * time.Millisecond) } } func main() { go sayHello() time.Sleep(500 * time.Millisecond) }
上の例では、ゴルーチンは go SayHello()
によって開始され、 sayHello() # になります。 ## 関数は同時に実行できます。メインの goroutine を
time.Sleep() を通じて一定期間待機させて、 goroutine が実行するのに十分な時間を確保します。プログラムを実行すると、「Hello」が 5 回表示されます。
package main import ( "fmt" ) func writeToChannel(ch chan string) { ch <- "Hello, this is from channel!" } func main() { ch := make(chan string) go writeToChannel(ch) msg := <-ch fmt.Println(msg) }
make(chan string) によって作成され、それを
writeToChannel() 関数に渡します。
writeToChannel() で、
ch <-「こんにちは、チャネルからです!」 を介してチャネルにデータを書き込みます。メインのゴルーチンで、
<-ch を使用してチャネルからデータを読み取り、出力します。プログラムを実行すると、「こんにちは、チャンネルからです!」と表示されます。
package main import ( "fmt" "sync" "time" ) var counter int var mutex sync.Mutex func increment() { mutex.Lock() defer mutex.Unlock() counter++ fmt.Println(counter) } func main() { var wg sync.WaitGroup for i := 0; i < 10; i++ { wg.Add(1) go func() { defer wg.Done() increment() }() } wg.Wait() }
sync.Mutex を使用して
counter 変数の同時更新を保護し、複数のゴルーチンによる同時変更によって引き起こされるデータの不整合を回避します。
sync.WaitGroup を使用して、すべての goroutine の実行が完了するのを待ちます。
以上がGo 言語の同時実行機能の分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。