(modifier: Peut-être que je me trompe dans le sens de cette erreur. Cela indique-t-il que le pool de connexions sur mon CLIENT est plein?
J'essaie de faire un grand nombre de demandes http
simultanément en utilisant les modules python threading
et requests
. Je vois cette erreur dans journaux:
WARNING:requests.packages.urllib3.connectionpool:HttpConnectionPool is full, discarding connection:
Que puis-je faire pour augmenter la taille du pool de connexions pour les demandes?
Cela devrait faire l'affaire:
import requests
sess = requests.Session()
adapter = requests.adapters.HTTPAdapter(pool_connections=100, pool_maxsize=100)
sess.mount('http://', adapter)
resp = sess.get("/mypage")
Remarque: Utilisez cette solution uniquement si vous ne pouvez pas contrôler la construction du pool de connexions (comme décrit dans la réponse de @ Jahaja).
Le problème est que le urllib3
crée les pools à la demande. Il appelle le constructeur du urllib3.connectionpool.HTTPConnectionPool
classe sans paramètres. Les cours sont inscrits dans urllib3 .poolmanager.pool_classes_by_scheme
. L'astuce consiste à remplacer les classes par vos classes qui ont des paramètres par défaut différents:
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
Ensuite, vous pouvez appeler pour définir de nouveaux paramètres par défaut. Assurez-vous que cela est appelé avant toute connexion.
patch_http_connection_pool(maxsize=16)
Si vous utilisez des connexions https, vous pouvez créer une fonction similaire:
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