>백엔드 개발 >Golang >시간 초과가 발생할 때 Go에서 HTTP 요청을 효과적으로 취소하려면 어떻게 해야 합니까?

시간 초과가 발생할 때 Go에서 HTTP 요청을 효과적으로 취소하려면 어떻게 해야 합니까?

Patricia Arquette
Patricia Arquette원래의
2024-10-29 18:11:04862검색

How can I effectively cancel HTTP requests in Go when a timeout occurs?

고루틴 시간 초과 이해

제공된 코드에서 findCicCode() 함수의 결과 또는 시간 초과를 처리하기 위해 select 문을 사용하여 시간 초과 메커니즘을 구현했습니다. 50밀리초. 그러나 시간 초과 후에도 HTTP 호출이 계속 실행될 경우 리소스 누출 가능성에 대한 우려를 표명하셨습니다.

HTTP 요청 취소를 위한 컨텍스트 활용

이 문제를 해결하려면 다음을 활용할 수 있습니다. Go의 컨텍스트 개념 컨텍스트는 컨텍스트별 값을 고루틴과 연결하는 방법을 제공하고 취소를 허용합니다. 컨텍스트를 사용하면 시간 초과가 발생할 때 진행 중인 HTTP 호출을 취소할 수 있습니다.

다음은 HTTP 요청에 대한 컨텍스트 취소를 구현하는 방법에 대한 예입니다.

<code class="go">package main

import (
    "context"
    "fmt"
    "net/http"
    "time"
)

type Response struct {
    data   interface{}
    status bool
}

func Find() (interface{}, bool) {
    ch := make(chan Response, 1)

    ctx, cancel := context.WithTimeout(context.Background(), time.Second)
    defer cancel() // Ensure cancelation when the function exits

    go func() {
        data, status := findCicCode(ctx)
        ch <- Response{data: data, status: status}
    }()

    select {
    case response := <-ch:
        return response.data, response.status
    case <-time.After(50 * time.Millisecond):
        return "Request timed out", false
    }
}

func main() {
    data, timedOut := Find()
    fmt.Println(data, timedOut)
}</code>

이 수정된 코드에서:

  • 취소 함수와 함께 context.Context가 생성됩니다.
  • findCicCode() 함수는 시간 초과가 발생하면 진행 중인 요청을 취소하기 위해 ctx에 전달됩니다.
  • 각각 findCicCode() 함수 내에서 생성된 HTTP 요청은 req.WithContext(ctx)를 사용하여 ctx에 할당됩니다.
  • 시간 초과가 발생하면 취소 함수가 호출되어 ctx와 관련된 진행 중인 모든 HTTP 요청이 취소됩니다. .

이 접근 방식을 사용하면 시간 초과에 도달하면 진행 중인 모든 HTTP 요청이 취소되어 불필요한 리소스 소비를 방지할 수 있습니다.

위 내용은 시간 초과가 발생할 때 Go에서 HTTP 요청을 효과적으로 취소하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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