호출자 함수는 하위 고루틴의 패닉을 어떻게 복구합니까?
이전에는 고루틴의 패닉이 프로그램을 종료한다고 가정했습니다. 패닉이 발생하기 전에 호출자가 완료된 경우. 그러나 다르게 드러난 샘플 코드를 실험해 보면
샘플 코드:
<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가 고루틴에서 실행되는 최상위 함수이고 fun2가 패닉에서 복구되지 않으면 fun2 패닉이 발생하면 프로그램이 종료됩니다.
fun2가 고루틴의 최상위 함수이고 패닉을 처리하지 않으면 프로그램이 조기에 종료됩니다.
고루틴 자율성:
고루틴은 다른 고루틴의 패닉에서 복구할 수 없습니다. 따라서 fun2가 패닉 상태일 때 fun1의 지연된 호출은 호출되지 않습니다.
결론:
호출자 함수는 고루틴이 명시적으로 복구하지 않는 한 자신이 생성한 고루틴의 패닉에서 복구할 수 없습니다. 프로그램 호출자가 종료되기 전에 패닉에서 벗어날 수 있습니다.
위 내용은 호출자 함수가 Go에서 하위 고루틴의 패닉을 복구할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!