>  기사  >  백엔드 개발  >  호출자 함수의 지연된 '복구'가 하위 고루틴의 패닉을 처리하지 못하는 이유는 무엇입니까?

호출자 함수의 지연된 '복구'가 하위 고루틴의 패닉을 처리하지 못하는 이유는 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-11-03 18:06:03628검색

Why Doesn't a Deferred `recover` in a Caller Function Handle Panics in Child Goroutines?

자식 고루틴에서 호출자 함수가 패닉을 처리하는 방법

이전에는 호출자 함수가 호출자 함수인 경우 고루틴에서 패닉이 발생하면 프로그램이 종료될 것이라고 믿었습니다. 패닉이 일어나기 전에 끝났다. 그러나 최근 코드 예제에서는 다음과 같이 제안합니다.

<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 사양에 따르면:

"F 함수를 실행하는 동안 패닉에 대한 명시적 호출 또는 런타임 패닉으로 인해 F의 실행이 종료됩니다. 그런 다음 F에서 연기한 모든 함수는 평소와 같이 실행됩니다. 다음으로 F의 호출자가 실행하는 모든 연기된 함수가 실행됩니다. , 그리고 실행 중인 고루틴의 최상위 함수에 의해 지연된 모든 것까지 계속됩니다. 이 시점에서 프로그램은 종료되고 패닉에 대한 인수 값을 포함하여 오류 조건이 보고됩니다. "

코드에 적용

이 사양을 코드에 적용하면 다음과 같은 결과가 나타납니다.

  • fun2가 패닉 상태에 빠지면 최상위 고루틴을 종료하고 종료합니다.
  • fun2가 패닉에서 회복되지 않아 프로그램이 종료됩니다.
  • 패닉이 다른 고루틴에서 발생하기 때문에 fun1의 지연된 호출은 호출되지 않습니다.

결론

따라서 고루틴은 다른 고루틴의 패닉에서 회복할 수 없다는 점을 이해하는 것이 중요합니다. 하위 고루틴이 패닉에 빠지면 고루틴 자체만이 연기/복구 메커니즘을 사용하여 패닉을 처리할 수 있습니다. 하위 고루틴이 복구되지 않으면 호출자의 상태에 관계없이 전체 프로그램이 종료됩니다.

위 내용은 호출자 함수의 지연된 '복구'가 하위 고루틴의 패닉을 처리하지 못하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.