(編集:このエラーの意味が間違っている可能性があります。これは、CLIENTの接続プールがいっぱいであることを示していますか?またはSERVERの接続プールがいっぱいで、これがクライアントに与えられているエラーですか?)
python http
およびthreading
モジュールを使用して、多数のrequests
リクエストを同時に作成しようとしています。このエラーはログ:
WARNING:requests.packages.urllib3.connectionpool:HttpConnectionPool is full, discarding connection:
リクエストの接続プールのサイズを増やすにはどうすればよいですか?
これでうまくいくはずです:
import requests
sess = requests.Session()
adapter = requests.adapters.HTTPAdapter(pool_connections=100, pool_maxsize=100)
sess.mount('http://', adapter)
resp = sess.get("/mypage")
注:このソリューションは、接続プールの構築を制御できない場合にのみ使用してください(@Jahajaの回答を参照)。
問題は、urllib3
がオンデマンドでプールを作成することです。パラメーターなしでurllib3.connectionpool.HTTPConnectionPool
クラスのコンストラクターを呼び出します。クラスはurllib3 .poolmanager.pool_classes_by_scheme
に登録されています。トリックは、クラスを異なるデフォルトパラメータを持つクラスに置き換えることです。
def patch_http_connection_pool(**constructor_kwargs):
"""
This allows to override the default parameters of the
HTTPConnectionPool constructor.
For example, to increase the poolsize to fix problems
with "HttpConnectionPool is full, discarding connection"
call this function with maxsize=16 (or whatever size
you want to give to the connection pool)
"""
from urllib3 import connectionpool, poolmanager
class MyHTTPConnectionPool(connectionpool.HTTPConnectionPool):
def __init__(self, *args,**kwargs):
kwargs.update(constructor_kwargs)
super(MyHTTPConnectionPool, self).__init__(*args,**kwargs)
poolmanager.pool_classes_by_scheme['http'] = MyHTTPConnectionPool
その後、呼び出して新しいデフォルトパラメータを設定できます。接続が確立される前に、これが呼び出されることを確認してください。
patch_http_connection_pool(maxsize=16)
Https接続を使用する場合、同様の機能を作成できます。
def patch_https_connection_pool(**constructor_kwargs):
"""
This allows to override the default parameters of the
HTTPConnectionPool constructor.
For example, to increase the poolsize to fix problems
with "HttpSConnectionPool is full, discarding connection"
call this function with maxsize=16 (or whatever size
you want to give to the connection pool)
"""
from urllib3 import connectionpool, poolmanager
class MyHTTPSConnectionPool(connectionpool.HTTPSConnectionPool):
def __init__(self, *args,**kwargs):
kwargs.update(constructor_kwargs)
super(MyHTTPSConnectionPool, self).__init__(*args,**kwargs)
poolmanager.pool_classes_by_scheme['https'] = MyHTTPSConnectionPool