В библиотеке запросов, как я могу избежать предупреждения "HttpConnectionPool is full, disarding connection"?
Я использую библиотеку запросов python с сеансами:
def _get_session(self):
if not self.session:
self.session = requests.Session()
return self.session
И иногда я получаю это предупреждение в своих журналах:
[2014/May/12 14:40:04 WARNING ] HttpConnectionPool is full, discarding connection: www.ebi.ac.uk
Мой вопрос: почему это предупреждение, а не исключение?
Это код, отвечающий за это (от http://pydoc.net/Python/requests/0.8.5/requests.packages.urllib3.connectionpool/):
def _put_conn(self, conn):
try:
self.pool.put(conn, block=False)
except Full:
# This should never happen if self.block == True
log.warning("HttpConnectionPool is full, discarding connection: %s"
% self.host)
Почему это исключение выловлено здесь? Если бы он был ререйзирован, я мог бы обработать это исключение в своем коде, создав новый сеанс и удалив старый.
Если это только предупреждение, значит ли это, что это никак не влияет на мои результаты? Могу ли я игнорировать это? Если нет, как я могу справиться с этой ситуацией?
Ответы
Ответ 1
Из документов запросов в http://docs.python-requests.org/en/latest/api/
class requests.adapters.HTTPAdapter(pool_connections=10, pool_maxsize=10, max_retries=0, pool_block=False)
Встроенный HTTP-адаптер для urllib3.
Предоставляет интерфейс общего случая для сеансов запросов для связи с URL-адресами HTTP и HTTPS путем реализации интерфейса транспортного адаптера. Этот класс обычно создается классом Session под обложками.
Параметры:
- pool_connections - количество пулов соединений urllib3 для кэширования.
- pool_maxsize - максимальное количество соединений для сохранения в пуле.
- max_retries (int) - Максимальное количество попыток, которое должно предпринять каждое соединение. Обратите внимание, что это относится только к неудачным соединениям и тайм-аутам, но не к запросам, когда сервер возвращает ответ.
- pool_block - должен ли пул соединений блокироваться для соединений.
и чуть ниже приводится пример
import requests
s = requests.Session()
a = requests.adapters.HTTPAdapter(max_retries=3)
s.mount('http://', a)
Попробуй это
a = requests.adapters.HTTPAdapter(pool_connections = N, pool_maxsize = M)
Где N и M подходят для вашей программы.
Ответ 2
Я хотел бы уточнить некоторые вещи здесь.
Аргумент max_poolsize
ограничивает количество TCP-соединений, которые могут одновременно храниться в пуле соединений. Обычно, когда вы хотите выполнить HTTP-запросы, запросы будут пытаться получить TCP-соединение из своего пула соединений. Если доступных соединений нет, запросы создадут новое TCP-соединение, а когда оно выполнит HTTP-запрос, он попытается вернуть его обратно в пул (он не будет помнить, было ли соединение взято из пула соединений или не).
Full
исключение, возникающее в коде запросов, является просто примером общего шаблона Python, который обычно перефразируется, так как просить прощения легче, чем разрешения. Это не имеет ничего общего с разрывом TCP-соединений.