Go에서 컨텍스트 누출: 건너뛰기의 의미 defer cancel()
Go에서 컨텍스트 패키지는 취소를 동시 실행으로 전달하는 방법을 제공합니다. 루틴. context.WithTimeout 함수는 지정된 기간 이후에 취소되는 시간 제한이 있는 새 컨텍스트를 생성합니다. 결과 취소 함수가 호출되지 않으면 컨텍스트 누출이 발생합니다.
제공된 코드 조각에서:
func Call(ctx context.Context, payload Payload) (Response, error) { req, err := http.NewRequest(...) ctx, cancel = context.WithTimeout(ctx, time.Duration(3) * time.Second) //defer cancel() missing here return http.DefaultClient.Do(req) }
defer cancel() 문이 없으면 취소 함수가 호출되지 않습니다. WithTimeout에 의해 생성된 고루틴은 계속해서 무기한 존재합니다. 요청이 완료되더라도 고루틴은 프로그램이 종료될 때까지 메모리에 남아 있기 때문에 이는 메모리 누수입니다.
go vet 도구는 누수가 발생하면 과도한 메모리 소비로 이어질 수 있으므로 이 누수에 대해 경고합니다. 자주 발생합니다. 만성적인 메모리 누수는 결국 시스템 성능 문제나 심지어 충돌을 일으킬 수 있습니다.
컨텍스트 누출을 방지하려면 컨텍스트가 더 이상 필요하지 않을 때 취소 함수를 호출하는 것이 중요합니다. 가장 좋은 방법은 다음 수정 코드에 표시된 대로 WithCancel 또는 WithTimeout을 호출한 직후에 defer cancel() 문을 사용하는 것입니다.
func Call(ctx context.Context, payload Payload) (Response, error) { req, err := http.NewRequest(...) ctx, cancel = context.WithTimeout(ctx, time.Duration(3) * time.Second) defer cancel() // Added defer cancel() to release resources return http.DefaultClient.Do(req) }
이 방법을 준수하면 고루틴 및 관련 리소스가 사용 후 즉시 해제되어 메모리 누수 가능성을 최소화하고 시스템 성능을 최적화합니다.
위 내용은 Go에서 컨텍스트 누출을 방지하기 위해 `defer cancel()`이 중요한 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!