>  기사  >  백엔드 개발  >  호출자 함수가 하위 고루틴 패닉에서 복구할 수 있나요?

호출자 함수가 하위 고루틴 패닉에서 복구할 수 있나요?

Susan Sarandon
Susan Sarandon원래의
2024-11-04 08:21:30702검색

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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