ホームページ >バックエンド開発 >Golang >呼び出し元関数は子ゴルーチンのパニックから回復できますか?

呼び出し元関数は子ゴルーチンのパニックから回復できますか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-04 08:21:30754ブラウズ

Can a Caller Function Recover from a Child Goroutine Panic?

子ゴルーチンのパニックからの呼び出し元関数の回復

一般に信じられていることに反して、ゴルーチンのパニックは必ずしもプログラム全体を終了させるわけではありません。この誤解は、呼び出し元の遅延回復機能がパニックに対処するという想定から生じています。ただし、ゴルーチンでパニックが発生する前に呼び出し元が終了した場合はこの限りではありません。

次の例を考えてみましょう。

<code class="go">func fun1() {
    fmt.Println("fun1 started")
    defer func() {
        if err := recover(); err != nil {
            fmt.Println("recover in func1")
        }
    }()

    go fun2()

    time.Sleep(10 * time.Second) // wait for the boom!
    fmt.Println("fun1 ended")
}

func fun2() {
    fmt.Println("fun2 started")

    time.Sleep(5 * time.Second)
    panic("fun2 booom!")

    fmt.Println("fun2 ended")
}</code>

呼び出し元関数 (fun1) の実行が終了しているにもかかわらず、 fun2 がパニックを起こしてもプログラムは終了します。これが発生するのは、Go の仕様で、ゴルーチンでパニックが発生すると次のように定義されているためです。

  • そのゴルーチンの実行は終了します。
  • そのゴルーチンによって呼び出された遅延関数は実行されます。
  • 呼び出し元の遅延関数が実行されます。

この場合、fun2 はゴルーチンの最上位関数であり、パニックから回復しません。したがって、プログラムは終了します。

重要な点は、

ゴルーチンは、別のゴルーチンで発生したパニックから回復できないということです。

以上が呼び出し元関数は子ゴルーチンのパニックから回復できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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