ホームページ >バックエンド開発 >Golang >バッファ付きチャネルをセマフォとして使用する場合に、すべてのゴルーチンが完了していることを確認するにはどうすればよいですか?

バッファ付きチャネルをセマフォとして使用する場合に、すべてのゴルーチンが完了していることを確認するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-29 06:27:12344ブラウズ

How to Ensure All Goroutines Complete When Using a Buffered Channel as a Semaphore?

空のバッファーされたチャネル (セマフォ) を待ちます

同時プログラミングでは、同時に実行するゴルーチンの数を制御することが重要です。 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。