2013-08-27 1 views
32

(Возможно, я ошибаюсь в том, что означает эта ошибка. Является ли это указанием на то, что пул соединений в моем КЛИЕНТЕ заполнен? Или пул соединений в SERVER заполнен, и это ошибка, которую предоставляет мой клиент?)Могу ли я изменить размер пула соединений для модуля запросов «Python»?

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

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

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

ответ

70

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

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

Это работает для меня. Он должен быть отмечен как правильный ответ. – reish

9

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

Запросы имеют встроенный API для предоставления параметров конструктора ConnectionPool, исправление конструктора необязательно. (См. Ответ @ Jahaja.) – shazow

+1

Это зависит от контекста. Если у вас есть контроль над созданием HTTPAdapter, использование конструктора является правильным решением. Но бывают случаи, когда пул соединений инициализируется где-то глубоко зарытым в некоторых рамках или библиотеке. В этих случаях вы можете исправить библиотеку или исправить конструктор пула соединений, как я описал выше. –

+0

Я добавил разъяснение к моему решению. –

 Смежные вопросы

  • Нет связанных вопросов^_^