>백엔드 개발 >Golang >Go 루틴에서 패닉을 어떻게 복구할 수 있나요?

Go 루틴에서 패닉을 어떻게 복구할 수 있나요?

DDD
DDD원래의
2024-11-07 13:51:03194검색

How Can I Recover from Panics in Go Routines?

Go 루틴의 패닉 복구

Go 루틴은 동시성을 위한 강력한 메커니즘을 제공하여 독립적인 작업의 병렬 실행을 가능하게 합니다. 그러나 Go 루틴 내에서 패닉을 처리하는 것은 어려울 수 있습니다.

Go 루틴의 복구 이해

recover 기능을 사용하면 함수 범위 내에서 발생하는 패닉에서 복구할 수 있습니다. 그러나 그 효과는 패닉이 발생하는 동일한 고루틴으로 제한됩니다. 다른 고루틴의 패닉 복구 시도는 실패합니다.

코드 예: 패닉 복구 실패

다음은 패닉 복구 실패를 보여주는 코드 조각입니다. go routine:

func main() {
    // Note: the following code will panic
    go handle(make(chan int64))

    for {}
}

func handle(done chan int64) {
    var a *int64
    a = nil

    fmt.Println(*a)
    done <- *a
}

패닉을 시작한 동일한 고루틴 내에서 복구를 호출해야 하기 때문에 이 코드는 핸들 고루틴의 패닉에서 복구하지 못합니다.

코드 예: 성공적인 패닉 복구

go 루틴에서 패닉을 성공적으로 복구하려면 문제가 있는 고루틴 내에 지연 복구 문을 추가해야 합니다. 예상대로 작동하는 이전 코드의 수정된 버전은 다음과 같습니다.

func main() {
    done := make(chan int64)

    go func() {
        defer func() {
            if r := recover(); r != nil {
                fmt.Println("Recovered")
            }
        }()

        var a *int64
        a = nil

        fmt.Println(*a)
        done <- *a
    }()

    for {}
}

이 예에서 지연된 복구 문을 사용하면 goroutine이 패닉을 우아하게 처리하고 복구 메시지를 기록할 수 있습니다.

기본 메커니즘

Go 문서에 따르면 패닉 종료는 현재 고루틴의 모든 지연된 함수가 실행된 경우에만 발생합니다. 따라서 go 루틴에서 패닉을 복구하려면 일반적으로 지연된 함수를 통해 패닉을 시작한 동일한 goroutine 내에서 복구를 호출해야 합니다.

위 내용은 Go 루틴에서 패닉을 어떻게 복구할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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