web-dev-qa-db-ja.com

Pythonの「リクエスト」モジュールの接続プールサイズを変更できますか?

(編集:このエラーの意味が間違っている可能性があります。これは、CLIENTの接続プールがいっぱいであることを示していますか?またはSERVERの接続プールがいっぱいで、これがクライアントに与えられているエラーですか?)

python httpおよびthreadingモジュールを使用して、多数のrequestsリクエストを同時に作成しようとしています。このエラーはログ:

WARNING:requests.packages.urllib3.connectionpool:HttpConnectionPool is full, discarding connection:

リクエストの接続プールのサイズを増やすにはどうすればよいですか?

40
Skip Huffman

これでうまくいくはずです:

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

注:このソリューションは、接続プールの構築を制御できない場合にのみ使用してください(@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
18
Michael_Scharf