Ответ 1
Это должно сделать трюк:
import requests
sess = requests.Session()
adapter = requests.adapters.HTTPAdapter(pool_connections=100, pool_maxsize=100)
sess.mount('http://', adapter)
resp = sess.get("/mypage")
(edit: Возможно, я ошибаюсь в том, что означает эта ошибка. Является ли это указанием на то, что пул соединений в моем CLIENT заполнен? или пул соединений в SERVER заполнен, и это ошибка, которую дает мой клиент?)
Я пытаюсь сделать большое количество запросов http
одновременно с использованием модуля python threading
и requests
. Я вижу эту ошибку в журналах:
WARNING:requests.packages.urllib3.connectionpool:HttpConnectionPool is full, discarding connection:
Что можно сделать, чтобы увеличить размер пула соединений для запросов?
Это должно сделать трюк:
import requests
sess = requests.Session()
adapter = requests.adapters.HTTPAdapter(pool_connections=100, pool_maxsize=100)
sess.mount('http://', adapter)
resp = sess.get("/mypage")
Примечание. Используйте это решение только в том случае, если вы не можете управлять построением пула соединений (как описано в ответе @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