ゴルーチンの完了後にチャネルを閉じる
Go でゴルーチンとチャネルを操作する場合、多くの場合、すべてのゴルーチンがいつ完了したかを判断する必要があります。を実行し、それに応じてチャネルを閉じます。質問では、ゴルーチンの生成後にチャネルを明示的に閉じる方法と、スレッドカウントを使用する方法の 2 つの一般的なアプローチが示されています。
明示的なチャネルの閉鎖
最初のアプローチには、ゴルーチンの生成後にチャネルを閉じることが含まれます。すべてのゴルーチンが作成されます。ただし、チャネルが途中で閉じられ、ゴルーチンが結果を送信できなくなる可能性があります。
スレッド数
2 番目のアプローチでは、スレッド数が維持されます。カウントがゼロに達するとチャネルが閉じられます。機能している一方で、スリープ コールまたはビジー待機に依存しているため、非効率的になる可能性があります。
Sync.WaitGroup ソリューション
このタスクを達成するためのより効率的で信頼性の高い方法は、次のとおりです。 sync.WaitGroup タイプを使用します。 WaitGroup を使用すると、タスクの完了順序に関係なく、特定の数のタスクを待機できます。 WaitGroup を使用するように元の例を変更すると、次のようになります。
import ( "sync" ) func main() { var wg sync.WaitGroup for i := 0; i <= 10; i++ { wg.Add(1) go func() { result := calculate() c <- result wg.Done() }() } // Close the channel when all goroutines are finished go func() { wg.Wait() close(c) }() for result := range c { all_result = append(all_result, result...) } }
このアプローチにより、ゴルーチンはチャネルを閉じる前にタスクを完了でき、予期されるすべてのメッセージが確実に受信されるようになります。
以上がすべてのゴルーチンが終了した後に Go チャネルを確実に閉じるにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。