> 백엔드 개발 > Golang > defer cancel() 으로 이것이 의미가 있나요?

defer cancel() 으로 이것이 의미가 있나요?

王林
풀어 주다: 2024-02-12 13:45:06
앞으로
909명이 탐색했습니다.

这对于 defer cancel() 有意义吗?

질문 내용

http.HandlerFunc 中我得到了这个。但我的问题是:在应用超时上下文之后放置 defer cancel()에 이해가 되나요?

하단 선택은 컨텍스트가 완료될 때까지 계속 듣기 때문입니다. 그리고 컨텍스트가 완료된 후에 지연이 실행됩니다. 그런데 그게 다 됐나요? :)

//  Apply timeout context
var cancel context.CancelFunc
ctx, cancel = context.WithTimeout(ctx, time.Duration(time.Duration(match_route.timeout) * time.Second))
defer cancel() // <--- does this make sense

go func(){
    match_route.handler(w, r.WithContext(ctx))
    cancel()
}()

select {
case <-ctx.Done():
    if ctx.Err() == context.DeadlineExceeded {
        http.Error(w, "Timeout", http.StatusRequestTimeout)
    }
}
로그인 후 복사

해결 방법

예, 제 생각에는 이것이 의미가 있다고 생각합니다. 실제로 defer cancel() 的目的是确保调用 cancel 函数来释放与上下文关联的资源,无论函数如何退出,在您的示例中, cancel() 函数被推迟到 http.HandlerFunc 完成后或上下文完成时执行,因此 go func() 负责使用提供的上下文执行 match_route.handler 函数,然后调用 cancel()显式取消上下文,select 문을 사용하여 컨텍스트가 완료될 때까지 기다리고 마감 기한이 초과되어 컨텍스트가 완료되면 오류 응답이 반환됩니다!

위 내용은 defer cancel() 으로 이것이 의미가 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:stackoverflow.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿