私はpythonリクエストライブラリとセッションを使用しています:
def _get_session(self):
if not self.session:
self.session = requests.Session()
return self.session
また、ログに次の警告が表示されることがあります。
[2014/May/12 14:40:04 WARNING ] HttpConnectionPool is full, discarding connection: www.ebi.ac.uk
私の質問は、なぜこれが警告であり、例外ではないのかということです。
これはこれを担当するコードです( http://pydoc.net/Python/requests/0.8.5/requests.packages.urllib3.connectionpool/ から):
def _put_conn(self, conn):
try:
self.pool.put(conn, block=False)
except Full:
# This should never happen if self.block == True
log.warning("HttpConnectionPool is full, discarding connection: %s"
% self.Host)
なぜこの例外がここでキャッチされるのですか?再発生した場合は、新しいセッションを作成して古いセッションを削除することで、コードでこの例外を処理できます。
それが単なる警告である場合、それは私の結果にまったく影響を与えないことを意味しますか?無視してもいいですか?そうでない場合、どうすればこの状況に対処できますか?
http://docs.python-requests.org/en/latest/api/ のリクエストドキュメントから
class requests.adapters.HTTPAdapter(pool_connections=10, pool_maxsize=10, max_retries=0, pool_block=False)
Urllib3用の組み込みHTTPアダプター。
トランスポートアダプタインターフェイスを実装することにより、リクエストセッションがHTTPおよびHTTPSURLに接続するための一般的なケースのインターフェイスを提供します。このクラスは通常、内部のSessionクラスによって作成されます。
パラメーター:
- pool_connections –キャッシュするurllib3接続プールの数。
- pool_maxsize –プールに保存する接続の最大数。
- max_retries(int)–各接続が試行する必要のある再試行の最大数。これは、失敗した接続とタイムアウトにのみ適用され、サーバーが応答を返す要求には適用されないことに注意してください。
- pool_block –接続プールが接続をブロックする必要があるかどうか。
そして少し下に、例があります
import requests
s = requests.Session()
a = requests.adapters.HTTPAdapter(max_retries=3)
s.mount('http://', a)
これを試して
a = requests.adapters.HTTPAdapter(pool_connections = N, pool_maxsize = M)
NとMがプログラムに適している場合。
ここでいくつかのことを明確にしたいと思います。
max_poolsize
引数が行うことは、接続プールに同時に格納できるTCP接続の数を制限することです。通常、HTTPリクエストを実行する場合、リクエストは接続プールからTCP接続を取得しようとします。使用可能な接続がない場合、リクエストはnew TCP接続を作成し、HTTPリクエストの作成が完了すると、プールに戻そうとします(接続が接続プールから取得されたかどうかを覚えておいてください)。
リクエストコードで発生するFull
例外は、通常許可よりも許しを求める方が簡単ですと言い換えられる一般的なPythonパターンの例にすぎません。 TCP接続をドロップしても何も起こりません。