web-dev-qa-db-fra.com

Puis-je changer la taille du pool de connexions pour le module "requêtes" de Python?

(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?

40
Skip Huffman

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")
82
Jahaja

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
18
Michael_Scharf