Подтвердить что ты не робот

Могу ли я изменить размер пула соединений для модуля "запросы" Python?

(edit: Возможно, я ошибаюсь в том, что означает эта ошибка. Является ли это указанием на то, что пул соединений в моем CLIENT заполнен? или пул соединений в SERVER заполнен, и это ошибка, которую дает мой клиент?)

Я пытаюсь сделать большое количество запросов http одновременно с использованием модуля python threading и requests. Я вижу эту ошибку в журналах:

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

Что можно сделать, чтобы увеличить размер пула соединений для запросов?

4b9b3361

Ответ 1

Это должно сделать трюк:

import requests
sess = requests.Session()
adapter = requests.adapters.HTTPAdapter(pool_connections=100, pool_maxsize=100)
sess.mount('http://', adapter)
resp = sess.get("/mypage")

Ответ 2

Примечание. Используйте это решение только в том случае, если вы не можете управлять построением пула соединений (как описано в ответе @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