バッファリングされたチャネルが空になるのを待ちます
提供されたコードでは、バッファリングされたチャネルがセマフォとして使用され、同時チャネル数を制限します。ゴルーチンを実行しています。ただし、チャネルが空になるのを待つ明示的なメカニズムがないと、すべてのゴルーチンの実行が完了する前にメイン プログラムが終了する可能性があります。
問題:
それを確認する方法プログラムはすべてのゴルーチンが完了するまで待機します。終了しますか?
答え:
この目的でセマフォ (チャネル) を使用することは理想的ではありません。チャネルの長さをチェックして待機する方法が組み込まれていないためです。ゴルーチンが終了するのを適切に待つには、次のような同期プリミティブの使用を検討してください。 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 サイトの他の関連記事を参照してください。