呼び出し元関数は子ゴルーチンのパニックからどのように回復しますか?
以前は、ゴルーチンのパニックが発生するとプログラムが終了すると考えられていました。パニックが発生する前に呼び出し元が完了した場合。ただし、サンプル コードを試してみると、そうではないことがわかりました。
サンプル コード:
<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>
予期しない動作:
にもかかわらず呼び出し側関数の回復メカニズムがゴルーチンのパニックを処理すると期待されているため、プログラム全体はまだ終了しています。
説明:
Go 仕様では次のように述べられています。
fun2 が goroutine で実行されるトップレベル関数であり、fun2 がパニックから回復しない場合、fun2 がパニックになるとプログラムは終了します。
fun2 は goroutine のトップレベル関数であり、パニックから回復するため、パニックを処理しないと、プログラムは途中で終了します。
ゴルーチンの自律性:
ゴルーチンは、別のゴルーチンのパニックから回復できません。したがって、fun1 の遅延呼び出しは、fun2 がパニックになったときに呼び出されません。
結論:
呼び出し元関数は、ゴルーチンが明示的に回復しない限り、作成したゴルーチンのパニックから回復できません。プログラム呼び出し元が終了する前のパニックから。
以上がGo で呼び出し元関数は子ゴルーチンのパニックから回復できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。