>백엔드 개발 >Golang >패닉 이후에도 Go 고루틴을 어떻게 계속 실행할 수 있나요?

패닉 이후에도 Go 고루틴을 어떻게 계속 실행할 수 있나요?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-12-01 00:20:13157검색

How Can I Keep My Go Goroutines Running Even After a Panic?

충돌에도 불구하고 고루틴 실행 유지

Go에서 고루틴은 강력하지만 오류나 패닉으로 인해 충돌이 발생할 수 있습니다. 한 고루틴의 실패가 다른 고루틴에 영향을 미치지 않도록 하기 위해 개발자는 영향을 받지 않은 고루틴을 계속 실행하는 방법이 있는지 궁금해할 수 있습니다.

패닉에서 복구하기 위해 내장된 Recover() 기능이 활용됩니다. 이를 통해 지연된 함수 내에서 패닉을 포착할 수 있습니다. 다음 도우미 함수인 protected()는 이 메커니즘을 사용하여 패닉 복구 기능이 있는 고루틴을 시작합니다.

func protect(f func()) {
    defer func() {
        if err := recover(); err != nil {
            log.Printf("Recovered: %v", err)
        }
    }()

    f()
}

이 보호 기능을 사용하려면 함수를 protected()에 인수로 전달하기만 하면 됩니다. 지속적으로 "틱"을 인쇄하는 for 루프 내에 이 호출을 래핑함으로써 다른 고루틴에서 패닉이 발생하더라도 protected()로 보호되는 고루틴이 어떻게 계속 실행되는지 보여줄 수 있습니다.

func main() {
    go protect(doPanic)

    for {
        time.Sleep(time.Second)
        fmt.Println("tick")
    }
}

이 테스트 애플리케이션 다음과 같이 출력됩니다:

2021/03/04 14:12:31 about to panic
2021/03/04 14:12:31 Recovered: test
tick
tick
tick
...

보시다시피 doPanic 함수의 패닉이 복구되어 처리되는 반면 보호된 고루틴은 계속 실행되고 인쇄됩니다. "틱." 이 접근 방식은 고루틴을 패닉으로부터 효과적으로 격리하여 단일 오류가 전파되지 않고 전체 애플리케이션이 충돌하지 않도록 보장합니다.

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

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