>  기사  >  백엔드 개발  >  Go에서 컨텍스트 취소를 항상 연기해야 ​​하는 이유는 무엇입니까?

Go에서 컨텍스트 취소를 항상 연기해야 ​​하는 이유는 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-11-14 10:00:03116검색

Why Should You Always Defer Canceling a Context in Go?

컨텍스트 취소 실패: 결과 및 해결

Go의 동시성 환경에서 컨텍스트는 고루틴의 수명과 동작을 관리합니다. 마감일, 취소 신호 및 기타 필수 정보를 전파하는 수단을 제공합니다. 그러나 컨텍스트를 제대로 취소하지 못하면 원치 않는 결과가 발생할 수 있습니다.

다음 코드 조각을 고려하세요.

func Call(ctx context.Context, payload Payload) (Response, error) {
    req, err := http.NewRequest(...) // Some code that creates request from payload
    ctx, cancel = context.WithTimeout(ctx, time.Duration(3) * time.Second)
    defer cancel()
    return http.DefaultClient.Do(req)
}

여기서 3초의 시간 초과로 새 컨텍스트가 생성됩니다. defer cancel() 문이 없으면 함수는 Context를 명시적으로 취소하지 않고 반환됩니다. 이는 go vet의 경고를 유발합니다:

context에서 반환된 취소 함수.WithTimeout은 컨텍스트 누출을 방지하기 위해 삭제되지 않고 호출되어야 합니다

컨텍스트 누출 및 그 의미

그렇다면 Context가 취소되지 않으면 어떻게 될까요? 이 누락으로 인해 시스템에 "누출"이 발생합니다. 컨텍스트 취소 처리를 담당하는 고루틴은 아무 목적도 없는 경우에도 무기한 활성 상태로 유지됩니다. 이렇게 낭비되는 리소스는 프로그램 내에서 자주 발생하는 경우 상당한 메모리 오버헤드를 초래할 수 있습니다.

모범 사례: 즉시 취소

컨텍스트 누출을 방지하려면 즉시 취소를 연기하는 것이 모범 사례로 간주됩니다( ) WithCancel() 또는 WithTimeout()을 사용하여 새 컨텍스트를 만든 후. 이렇게 하면 조기 반환이나 예외에 관계없이 함수가 반환되는 즉시 취소 논리가 실행됩니다.

요약하자면, 컨텍스트 취소를 무시하면 고루틴이 무기한 실행되어 메모리 누수가 발생할 수 있습니다. 이를 방지하려면 WithCancel() 또는 WithTimeout()을 사용하여 새 컨텍스트를 생성한 직후 취소 기능을 항상 연기하십시오.

위 내용은 Go에서 컨텍스트 취소를 항상 연기해야 ​​하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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