ホームページ >バックエンド開発 >Golang >「DisableKeepAlives」が False に設定されているにもかかわらず、Go HTTP クライアントで複数の接続が作成されるのはなぜですか?

「DisableKeepAlives」が False に設定されているにもかかわらず、Go HTTP クライアントで複数の接続が作成されるのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-03 06:21:301038ブラウズ

Why Am I Still Creating Multiple Connections in My Go HTTP Client Even with `DisableKeepAlives` Set to False?

Go の HTTP クライアントでの接続再利用のトラブルシューティング

問題: を使用しているにもかかわらず、Go HTTP クライアントが同じホストへの複数の接続を作成するのはなぜですかDisableKeepAlives オプションを false に設定しますか?

Go HTTP クライアントは、デフォルトで接続を再利用するように設計されています。ただし、これを妨げる特定の条件があります。

診断:

提供されたコードでは、http.Transport.RoundTrip() メソッドは使用されません。その直後に resp.Close() が呼び出されます。これにより、リクエストの送信直後に接続が閉じられ、後続のリクエストで再利用できなくなる可能性があります。

解決策:

HTTP 接続を確実に再利用するには、 2 つの手順が必要です:

  1. 応答が完了するまで読み取り、応答本文からすべてのデータが消費されることを確認します。この目的には、io.Copy(ioutil.Discard, resp.Body) または ioutil.ReadAll(resp.Body) を使用します。
  2. res.Body.Close() を呼び出して、応答本文を明示的に閉じ、接続を解放します。

コード スニペット:

<code class="go">res, _ := client.Do(req)
io.Copy(ioutil.Discard, res.Body)
res.Body.Close()</code>

追加の考慮事項:

  • DisableKeepAlives オプションを true に設定すると、他の設定に関係なく、接続の再利用が明示的に無効になります。
  • 1 秒あたりの送信リクエスト数の制限は、time.Tick などの手法を使用して実現できます。ただし、これは接続の再利用とは特に関係がなく、接続の再利用が正しく機能している場合は必要ない可能性があります。

以上が「DisableKeepAlives」が False に設定されているにもかかわらず、Go HTTP クライアントで複数の接続が作成されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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