ホームページ >バックエンド開発 >Golang >パニック後でも Go ゴルーチンを実行し続けるにはどうすればよいですか?

パニック後でも Go ゴルーチンを実行し続けるにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-01 00:20:13156ブラウズ

How Can I Keep My Go Goroutines Running Even After a Panic?

クラッシュにもかかわらずゴルーチンを実行し続ける

Go では、ゴルーチンは強力ですが、エラーやパニックによるクラッシュの影響を受けやすい可能性があります。 1 つのゴルーチンの障害が他のゴルーチンに影響を及ぼさないようにするために、開発者は、影響を受けないゴルーチンを実行し続ける方法はないかと考えるかもしれません。

パニックから回復するには、組み込みの reverse() 関数が使用されます。これにより、遅延関数内でパニックを捕捉することができます。次のヘルパー関数、protect() は、このメカニズムを使用して、パニック回復を伴うゴルーチンを起動します。

func protect(f func()) {
    defer func() {
        if err := recover(); err != nil {
            log.Printf("Recovered: %v", err)
        }
    }()

    f()
}

この保護を使用するには、単に関数を引数として protected() に渡します。この呼び出しを、継続的に「tick」を出力する for ループ内でラップすることで、別の goroutine でパニックが発生した場合でも、protect() で保護された goroutine がどのように実行を継続するかを実証できます。

func main() {
    go protect(doPanic)

    for {
        time.Sleep(time.Second)
        fmt.Println("tick")
    }
}

このテスト アプリケーション出力は次のとおりです:

2021/03/04 14:12:31 about to panic
2021/03/04 14:12:31 Recovered: test
tick
tick
tick
...

ご覧のとおり、保護された goroutine は実行と出力を続行しながら、doPanic 関数のパニックは回復して処理されます。 「カチカチ」。このアプローチにより、ゴルーチンがパニックから効果的に分離され、単一の障害が伝播してアプリケーション全体がクラッシュすることがなくなります。

以上がパニック後でも Go ゴルーチンを実行し続けるにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。