>  기사  >  백엔드 개발  >  golang은 httpclient를 닫습니다.

golang은 httpclient를 닫습니다.

WBOY
WBOY원래의
2023-05-27 12:35:08832검색

Go 언어에서 http 클라이언트는 매우 일반적으로 사용되는 네트워크 요청 라이브러리입니다. 네트워크 요청 중에 성능을 최적화하고 리소스를 해제하기 위해 요청이 완료된 후 제때에 http 클라이언트를 닫아야 하는 경우가 많습니다. 그렇다면 Go 언어로 http 클라이언트를 닫는 방법은 무엇입니까? 이 글에서는 http 클라이언트를 닫는 방법과 주의사항을 소개합니다.

Http 클라이언트를 닫는 방법

Go 언어에서 http 클라이언트를 닫는 것은 http 클라이언트의 Close 메서드를 호출하여 수행됩니다. http 클라이언트의 Close 메소드는 닫히지 않은 연결을 포함하여 모든 연결을 해제합니다. 일반적으로 리소스 해제 요청이 완료된 후 즉시 http 클라이언트의 Close 메서드를 호출해야 합니다.

샘플 코드는 다음과 같습니다.

package main

import (
    "fmt"
    "net/http"
)

func main() {
    client := http.Client{}
    req, _ := http.NewRequest("GET", "http://www.example.com", nil)

    resp, err := client.Do(req)
    if err != nil {
        fmt.Println("Error:", err)
    }

    defer resp.Body.Close()
    defer client.Close()

    fmt.Println(resp.Body)
}

위 샘플 코드에서는 http 클라이언트를 사용하여 GET 요청을 보내고 요청이 완료된 후 http 클라이언트의 Close 메소드를 호출합니다.

Notes

http 클라이언트를 사용할 때 다음 사항에 주의해야 합니다.

  1. http 클라이언트 재사용: 어떤 경우에는 http 클라이언트를 재사용해야 하며, 이렇게 하면 각 요청 클라이언트에 대해 새 http 클라이언트가 생성되는 것을 피할 수 있습니다. . Do 메소드를 호출할 때 재사용된 http.Client를 전달할 수 있습니다.
package main

import (
    "fmt"
    "net/http"
)

func main() {
    transport := http.DefaultTransport.(*http.Transport).Clone()
    client := http.Client{Transport: transport}

    req1, _ := http.NewRequest("GET", "http://www.example.com", nil)
    resp1, err := client.Do(req1)
    if err != nil {
        fmt.Println("Error:", err)
    }

    req2, _ := http.NewRequest("GET", "http://www.example.com", nil)
    resp2, err := client.Do(req2)
    if err != nil {
        fmt.Println("Error:", err)
    }

    defer resp1.Body.Close()
    defer resp2.Body.Close()

    fmt.Println(resp1.Body)
    fmt.Println(resp2.Body)
}

위 예제 코드에서는 먼저 http.DefaultTransport를 복사한 다음 새 http 클라이언트를 생성했습니다. 그런 다음 각각 두 개의 GET 요청을 보내고 각각 응답에서 본문을 읽었습니다.

  1. 동시 요청: 동시 요청 시 http 클라이언트 사용에도 주의가 필요합니다. 여러 요청이 동시에 전송되는 경우 각 요청에 대해 새 http 클라이언트를 만드는 것은 현명하지 않습니다. 이로 인해 시스템 리소스가 낭비되고 교착 상태가 발생할 수 있습니다. 따라서 기존 http 클라이언트를 재사용해야 합니다.
package main

import (
    "fmt"
    "net/http"
)

func main() {
    client := &http.Client{}

    respChan := make(chan *http.Response)

    get := func(url string) {
        req, _ := http.NewRequest("GET", url, nil)
        resp, _ := client.Do(req)
        defer resp.Body.Close()

        respChan <- resp
    }

    urls := []string{"http://www.example.com", "http://www.example.org", "http://www.example.net"}
    for _, url := range urls {
        go get(url)
    }

    for range urls {
        resp := <-respChan
        fmt.Println(resp.Body)
    }

    client.Close()
}

위의 샘플 코드에서는 3개의 GET 요청을 동시에 보냈습니다. respChan 채널을 사용하여 각 요청에 대한 응답을 수신합니다. 루프에서는 respChan 채널의 각 응답을 읽고 응답의 Body를 출력합니다.

결론

http 클라이언트를 닫는 것이 매우 중요합니다. 제때 닫히지 않으면 시스템 리소스가 낭비되고 심각한 문제가 발생할 수도 있습니다. http 클라이언트를 사용할 때 성능 최적화 및 리소스 해제를 위해 동시 요청 및 http 클라이언트 재사용과 같은 몇 가지 문제에 주의를 기울여야 합니다. Go 언어에서는 http 클라이언트를 닫으려면 Close 메서드만 호출하면 됩니다.

위 내용은 golang은 httpclient를 닫습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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