Go で複数の goroutine を一度に終了する方法
Go では、複数の goroutine を同時に終了する必要があるシナリオに遭遇することがあります。これは、1 つのゴルーチンの完了が他のゴルーチンの終了をトリガーする必要がある場合に特に便利です。
次のコード スニペットを考えてみましょう:
func main() { go func() { ... if err != nil { return } }() go func() { ... if err != nil { return } }() }
この場合、ゴルーチンの 1 つが実行されたときに、戻った場合、もう一方も終了する必要があります。これを実現する一般的なアプローチは、シグナリングにチャネルを使用することです。ただし、これにより、クローズド チャネルへの書き込みパニックが発生する可能性があります。
この問題に対する確実な解決策は、Go のコンテキスト メカニズムを活用することです。コンテキストを使用すると、ルーチン間の通信を確立し、操作が完了またはキャンセルされたときに信号を送信できます。以下に例を示します。
package main import ( "context" "sync" ) func main() { ctx, cancel := context.WithCancel(context.Background()) wg := sync.WaitGroup{} wg.Add(3) go func() { defer wg.Done() for { select { // msg from other goroutine finish case <-ctx.Done(): // end } } }() go func() { defer wg.Done() for { select { // msg from other goroutine finish case <-ctx.Done(): // end } } }() go func() { defer wg.Done() // your operation // call cancel when this goroutine ends cancel() }() wg.Wait() }
この例では、終了シグナルをチェックするために goroutine に渡すことができるコンテキストを作成します。 3 番目のゴルーチンが操作を完了すると、cancel() が呼び出され、完了を待っている両方のゴルーチンにシグナルが送信されます。その結果、すべてのゴルーチンは正常に終了します。
以上がGo で複数のゴルーチンを同時に正常に強制終了するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。