クラッシュにもかかわらず goroutine の永続性を確保する
同時 Go プログラムでは、多くの場合、複数の goroutine が同時に実行され、それぞれが別個のタスクを実行します。ただし、ゴルーチンの障害を処理する問題に対処し、1 つのゴルーチンがクラッシュした場合でも他のゴルーチンが実行を継続できるようにすることが重要です。
2 つのゴルーチンを持つプログラムを考えてみましょう: queue.ConsumeAndDoSomething() はキューを消費し、api.StartServer () は API を実行します。理想的には、queue.ConsumeAndDoSomething() が失敗しても API サーバーは影響を受けず、その逆も同様です。
この永続性を実現する 1 つのアプローチは、組み込みの reverse() 関数と遅延関数を使用することです。 reverse() 関数はパニックをキャッチしてクリーンアップ ルーチンを実行できますが、遅延関数は周囲の関数の最後に自動的に実行されます。
recover() 関数と遅延関数を使用してゴルーチンのクラッシュから保護する方法は次のとおりです。
func protect(f func()) { defer func() { if err := recover(); err != nil { log.Printf("Recovered: %v", err) } }() f() }
このヘルパー関数、protect() は、提供された関数 (f) を、パニックを処理する遅延関数でラップします。遅延関数は、パニックが発生するかどうかに関係なく、 f が返される前に実行されます。
protect() を使用するには、引数として goroutine 関数を渡すだけです。
func main() { go protect(queue.ConsumeAndDoSomething) go protect(api.StartServer) for { time.Sleep(time.Second) fmt.Println("tick") } }
このメカニズムではこの場合、queue.ConsumeAndDoSomething() または api.StartServer() のいずれかでパニックが発生した場合、遅延関数によってキャッチされ、何もせずにクリーンアップされます。プログラムをクラッシュさせます。他のゴルーチンは期待どおりに実行を継続します。
以上がGo の「recover()」関数は、クラッシュに直面しても Goroutine の永続性をどのように保証できるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。