Go アプリケーションでは、複数の goroutine のシャットダウンを調整することが、クリーンで同期的な終了を保証するために重要です。この記事では、どちらかのルーチンでエラーが発生したときに一緒に戻るように 2 つのゴルーチンを同期する問題について説明します。
次のコード スニペットを考えてみましょう。
func main() { go func() { ... if err != nil { return } }() go func() { ... if err != nil { return } }() }
このシナリオでは、ゴルーチンの同期が必要です。そのため、一方がエラーに遭遇して復帰すると、もう一方も終了する必要があります。課題は、パニックを引き起こす可能性がある閉じたチャネルへの書き込みを導入せずにこれを達成することにあります。
非常に効果的な解決策には、ゴルーチン間の通信に 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() }
このコードでは、コンテキスト変数 ctx がゴルーチン間の通信チャネルとして機能します。いずれかのゴルーチンでエラーが発生すると、コンテキストで cancel() が呼び出され、他のゴルーチンに終了するよう通知されます。このエレガントなソリューションにより、パニックのリスクを伴うことなく、すべてのゴルーチンが正常にシャットダウンされます。
以上がエラーが発生したときに Go で複数の Goroutine を正常にシャットダウンする方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。