Golang におけるゴルーチンとチャネルの実行順序制御方法
Golang プログラミングにおいて、ゴルーチンとチャネルは非常に重要な概念です。 Goroutine は、プログラムの実行中に複数の関数を同時に実行できる軽量のスレッドです。チャネルはゴルーチン間の通信に使用されるメカニズムです。
場合によっては、プログラムが期待どおりに実行されるように、Goroutine と Channel の実行順序を制御する必要があります。この記事では、Goroutine と Channel のシーケンス制御を実装する一般的な方法をいくつか紹介します。
WaitGroup は、Goroutine のグループの終了を待つために使用されるカウンターです。その動作原理は、Goroutine が開始されるたびにカウンターが 1 ずつインクリメントされ、Goroutine が実行されるたびにカウンターが 1 ずつデクリメントされるというものです。カウンタがゼロになると、メインスレッドは実行を継続します。
以下は、シーケンス制御に WaitGroup を使用するサンプル コードです。
package main import ( "fmt" "sync" ) func main() { var wg sync.WaitGroup wg.Add(2) go func() { defer wg.Done() fmt.Println("Goroutine 1") }() go func() { defer wg.Done() fmt.Println("Goroutine 2") }() wg.Wait() fmt.Println("Main Goroutine") }
この例では、2 つのゴルーチンを作成し、各ゴルーチンがメッセージを出力します。各ゴルーチンでは、defer wg.Done()
ステートメントでカウンターを 1 つデクリメントします。最後に、wg.Wait()
は、すべてのゴルーチンが実行されるまでメインスレッドをブロックします。
上記のコードを実行すると、出力は次のようになります:
Goroutine 1 Goroutine 2 Main Goroutine
ゴルーチン 1 とゴルーチン 2 の実行順序は不確実ですが、メイン スレッドが「Main Goroutine」を出力する前である必要があります。 " 仕上げる。
バッファなしのチャネルを使用すると、別の Goroutine がそのチャネルからデータを受信するまで、Goroutine の実行をブロックできます。 Goroutine の依存関係チェーンを構築することで、複数の Goroutine を順番に実行できます。
以下は、シーケンシャル制御にバッファなしチャネルを使用するサンプル コードです:
package main import ( "fmt" ) func main() { ch1 := make(chan struct{}) ch2 := make(chan struct{}) go func() { fmt.Println("Goroutine 1") ch1 <- struct{}{} }() go func() { <-ch1 fmt.Println("Goroutine 2") ch2 <- struct{}{} }() <-ch2 fmt.Println("Main Goroutine") }
この例では、Goroutine 1 がメッセージを出力した後、空の構造体を ch1 チャネルに送信します。次に、Goroutine 2 は ch1 チャネルからデータを受信した後、別のメッセージを出力し、空の構造体を ch2 チャネルに送信します。最後に、メインスレッドは ch2 チャネルからデータを受信した後、「Main Goroutine」を出力します。
上記のコードを実行すると、出力結果は次のようになります:
Goroutine 1 Goroutine 2 Main Goroutine
Goroutine 1 と Goroutine 2 の実行順序が決定されており、メイン スレッドが " を出力する前に完了する必要があることがわかります。メインゴルーチン」。
バッファ付きチャネルを使用すると、作成時に容量を指定でき、一定量のデータを保存できます。バッファサイズを適切に設定することで、Goroutineの同時実行数を制御し、シーケンス制御を実現できます。
以下はバッファ付きチャネルを使用したシーケンシャル制御のサンプルコードです:
package main import ( "fmt" ) func main() { ch := make(chan struct{}, 2) go func() { fmt.Println("Goroutine 1") ch <- struct{}{} }() go func() { fmt.Println("Goroutine 2") ch <- struct{}{} }() <-ch <-ch fmt.Println("Main Goroutine") }
この例では、容量 2 のバッファを持つ ch チャネルを作成します。各ゴルーチンでは、空の構造体を ch チャネルに送信します。最後に、メインスレッドは ch チャネルからデータを 2 回受信した後、「Main Goroutine」を出力します。
上記のコードを実行すると、出力結果は次のようになります:
Goroutine 1 Goroutine 2 Main Goroutine
Goroutine 1 と Goroutine 2 の実行順序が決定されており、メイン スレッドが " を出力する前に完了する必要があることがわかります。メインゴルーチン」。
上記の方法により、GoroutineとChannelの実行順序を柔軟に制御することができます。実際のニーズに応じて、適切な方法を選択することで、プログラムの同時実行性と効率を向上させることができます。
概要:
この記事では、Golang で Goroutine と Channel の実行順序を制御するための 3 つの一般的な方法 (WaitGroup の使用、バッファなしチャネルの使用、およびバッファ付きチャネルの使用) を紹介します。これらのメソッドを合理的に使用することで、柔軟な同時実行制御が実現され、プログラムのパフォーマンスと効率が向上します。
以上がGolangにおけるGoroutineとChannelの実行順序制御方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。