Go の「recover()」関数は、クラッシュに直面しても Goroutine の永続性をどのように保証できるのでしょうか?

DDD
リリース: 2024-11-23 01:39:37
オリジナル
820 人が閲覧しました

How Can Go's `recover()` Function Ensure Goroutine Persistence in the Face of Crashes?

クラッシュにもかかわらず 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート