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

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

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-30 10:09:11512ブラウズ

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

バッファリングされたチャネルが空になるのを待ちます

提供されたコードでは、バッファリングされたチャネルがセマフォとして使用され、同時チャネル数を制限します。ゴルーチンを実行しています。ただし、チャネルが空になるのを待つ明示的なメカニズムがないと、すべてのゴルーチンの実行が完了する前にメイン プログラムが終了する可能性があります。

問題:

それを確認する方法プログラムはすべてのゴルーチンが完了するまで待機します。終了しますか?

答え:

この目的でセマフォ (チャネル) を使用することは理想的ではありません。チャネルの長さをチェックして待機する方法が組み込まれていないためです。ゴルーチンが終了するのを適切に待つには、次のような同期プリミティブの使用を検討してください。 sync.WaitGroup.

更新されたコード:

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 は、未処理のタスク (この場合はゴルーチン) の数を維持します。 。これにより、メイン プログラムはすべてのタスクが完了するまで待機できます。 wg.Add(1) は新しい goroutine を開始する前にタスク数をインクリメントし、wg.Done() は goroutine が終了するときにカウントをデクリメントします。 wg.Wait() 呼び出しは、タスク数が 0 に達するまでメイン プログラムをブロックし、プログラムが終了する前にすべてのゴルーチンが完了していることを確認します。

以上がバッファ付きチャネルをセマフォとして使用する場合、プログラムが終了する前にすべてのゴルーチンが完了していることを確認するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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