Go ルーチンの実行順序
このコードは、2 つの同時 "go" ルーチン、つまり go ルーチンの Go ルーチンの実行順序の概念を示しています。 、は同時に実行されますが、順序は保証されません。
コードは、次の合計関数を定義しています。整数配列とチャネルを入力として使用します。この関数は、配列内の整数の合計を計算し、その結果を指定されたチャネルに送信します。
main 関数では、ゴルーチン間の通信を容易にするためにチャネル c が作成されます。 2 つのゴルーチンが起動され、それぞれが異なる入力配列で sum 関数を実行し、結果を c に送信します。
その後、プログラムはゴルーチンによって送信された値をチャネル c から受信して出力します。ただし、ゴルーチンが完了する順序は非決定的であるため、出力順序は異なる場合があります。
ゴルーチンの実行順序を制御するには、標準で提供されるチャネルのブロックや同期プリミティブなどのさまざまなメカニズムを使用できます。図書館。以下にいくつかの例を示します。
1.チャネルのブロック:
この修正バージョンでは、チャネルから値を受信するまでメイン ルーチンをブロックすることでゴルーチンが順次実行されます:
func main() { c := make(chan int) go sum([]int{1, 2, 3}, c) // Block until a value is received from c x := <-c fmt.Println(x) go sum([]int{4, 5, 6}, c) // Block until a value is received from c x = <-c fmt.Println(x) }
2。チャネルを使用した待機グループ:
別のオプションは、結果を処理する前にすべてのゴルーチンが実行を完了していることを確認するために、待機グループとチャネル上の範囲を使用することです:
func main() { c := make(chan int) wg := new(sync.WaitGroup) wg.Add(1) go sum([]int{1, 2, 3}, c, wg) wg.Wait() wg.Add(1) go sum([]int{4, 5, 6}, c, wg) wg.Wait() close(c) for x := range c { fmt.Println(x) } }
これらのテクニックを使用すると、ゴルーチンの実行順序を制御して、同時実行プログラムで望ましい動作を実現できます。
以上がGo ルーチンの実行順序を制御するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。