ホームページ >バックエンド開発 >Golang >golang httpclientを閉じる

golang httpclientを閉じる

WBOY
WBOYオリジナル
2023-05-27 12:35:08916ブラウズ

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 メソッドを呼び出します。

注意事項

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 クライアントを作成しました。次に、2 つの 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 チャネルから各応答を読み取り、応答の本文を出力します。

結論

http クライアントを閉じることは非常に重要です。時間内に閉じないと、システム リソースが無駄に消費され、重大な問題が発生する可能性もあります。 http クライアントを使用する場合は、同時リクエストや、パフォーマンスの最適化とリソースの解放のための http クライアントの再利用など、いくつかの問題に注意する必要があります。 Go 言語では、http クライアントを閉じるには、Close メソッドを呼び出すだけです。

以上がgolang httpclientを閉じるの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。