同時プログラミングでは、同時に実行するゴルーチンの数を制御することが重要です。 1 つのアプローチは、バッファリングされたチャネルをセマフォとして使用することです。ただし、セマフォが完全に空になるのを待っているときに、一般的な問題が発生します。
同時処理の制限が 2 つである整数のスライスがあるとします。ルーチンに行きます。この制限を強制するために、バッファリングされたチャネルをセマフォとして使用します。コードはほとんどの整数に対して機能しますが、バッファーが空にならないため、プログラムは最後の go ルーチンが終了する前に途中で終了します。
バッファーされたチャネルが空になるまでどのように待機しますか?完全に排出し、プログラムの前にすべての go ルーチンが完了していることを確認します。 exits?
チャネルの長さをチェックする競合のない方法がないため、チャネルを使用して特定の条件を待つことは実現できません。代わりに、sync.WaitGroup を使用して、すべての goroutine の完了を監視できます。
sem := make(chan struct{}, 2) var wg sync.WaitGroup for _, i := range ints { wg.Add(1) // acquire semaphore sem <- struct{}{} // start long running go routine go func(id int) { defer wg.Done() // do something // release semaphore <-sem }(i) } wg.Wait()
sync.WaitGroup を使用すると、すべての goroutine が完了するまで待つことができます。プログラムは終了し、すべての処理が完了したことを確認します。
以上がバッファ付きチャネルをセマフォとして使用する場合に、すべてのゴルーチンが完了していることを確認するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。