В библиотеке запросов, как я могу избежать предупреждения "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-соединений.