HTTP2接続用にhttp.Client
を構築しましたが、使用するクライアントとリソースを解放するために何をする必要がありますか?Goでhttp.Clientを解放するには?
ありがとうございました。
HTTP2接続用にhttp.Client
を構築しましたが、使用するクライアントとリソースを解放するために何をする必要がありますか?Goでhttp.Clientを解放するには?
ありがとうございました。
http.Client
"使用済み"リソースを解放する特別な方法は必要ありません。それが到達不能になると、それによって使用されるメモリはガベージコレクタによって再利用されます。
http.Client
は、接続または状態情報を保存しません。ドキュメントはさえhttp.Client
が再利用されるべきであると述べている:
クライアントの交通クライアントが再利用の代わりに、必要に応じて作成されなければならないので、一般的に、内部状態(キャッシュされたTCPコネクションを)持っています。クライアントは、複数のゴルーチンによって同時に使用するのに安全です。
使用して、独自のクライアントを構築する場合(例えば埋め込む)http.Client
、あなたは明示的に解放しなければならないリソースを割り当て、それをあなた自身のClose()
方法を提供し、それがある場合は、独自の実装を使用して、誰もがClose()
を呼び出す必要があることを文書もう必要ありません。
注:あなたがそれを混乱させる可能性が何
は、あなたが(Client.Do()
、Client.Get()
、Client.Post()
などのような)HTTP操作を行うためにhttp.Client
を使用している場合、彼らは*http.Response
の値を返すことで、その応答はを解放する必要があります。通常はResponse.Body.Close()
経由で接続、状態、その他のリソースを保持しています。 http
のパッケージドキュメントからの引用:
それが終了したときに、クライアントはレスポンスボディを閉じる必要があります。
resp, err := http.Get("http://example.com/") if err != nil { // handle error } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) // ...
またClient.Get()
で文書化されています
ときERR respには常にnil以外のresp.Bodyが含まれています。呼び出し元は、読んだらresp.Bodyを閉じる必要があります。
クライアントは特別な関数呼び出しを必要としませんが、response.Bodyが使用されている場合(Do、Get/Post/...関数を呼び出した結果)、 'resp.Body .Close() ' – fzerorubigd
@fzerorubigdしかし、これは' http.Client'のメソッドではなく、 'http.Client'とは何の関係もありません。 'http.Client'に関連するリソースを解放するのではなく、接続に関連するリソースを解放します。 – icza
私は知っています。私はそれを言った。しかしこれはhttp.Clientを使用する際の一般的な落とし穴です(これは一度だけ行いました)。私はそれをここで言及するのは悪い考えではないと思います:) – fzerorubigd