2014-05-13 25 views
11

Używam wnioski z Python Library z sesji:W bibliotece żądań, jak mogę uniknąć ostrzeżenia "HttpConnectionPool jest pełne, odrzucam połączenie"?

def _get_session(self): 
    if not self.session: 
     self.session = requests.Session() 
    return self.session 

A czasami dostaję tego ostrzeżenia w moich dziennikach:

[2014/May/12 14:40:04 WARNING ] HttpConnectionPool is full, discarding connection: www.ebi.ac.uk 

Moje pytanie brzmi: dlaczego tak się ostrzeżenie, a nie wyjątek ?

Jest to kod odpowiedzialny za to (od 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) 

Dlaczego ten wyjątek jest przechwycony tutaj? Jeśli zostałby przejęty, mógłbym obsłużyć ten wyjątek w moim kodzie, tworząc nową sesję i usuwając starą.

Jeśli to tylko ostrzeżenie, czy to oznacza, że ​​nie ma to żadnego wpływu na moje wyniki? Czy mogę to zignorować? Jeśli nie, jak mogę sobie z tym poradzić?

+1

Czy próbowałeś ustawić 'self.block' na' True'? – roippi

+1

Czy naprawdę chcę, aby moje żądania zostały zablokowane? Może to ostrzeżenie zniknie, ale czy są jakieś inne konsekwencje? Jest jakiś powód, dla którego nie jest to Prawda domyślna, prawda? – mnowotka

+0

': blok param: Jeśli ustawione na wartość True, nie będzie używanych więcej niż ** maksymalnych ** połączeń na raz. Jeśli nie są dostępne żadne wolne połączenia, połączenie zostanie zablokowane do momentu zwolnienia połączenia. " – roippi

Odpowiedz

6

z wniosków docs w http://docs.python-requests.org/en/latest/api/

class requests.adapters.HTTPAdapter(pool_connections=10, pool_maxsize=10, max_retries=0, pool_block=False) 

Wbudowany adapter HTTP dla urllib3.

Udostępnia interfejs ogólnego zastosowania sesji Żądania do kontaktowania się z adresami URL HTTP i HTTPS, implementując interfejs Transport Adapter . Ta klasa zwykle będzie tworzona przez klasę sesji pod okładkami.

Parametry:

  • pool_connections - liczba urllib3 pula połączeń do pamięci podręcznej.
  • pool_maxsize - maksymalna liczba połączeń do zapisania w puli.
  • max_retries (int) - Maksymalna liczba ponownych prób, które powinny zostać wykonane przez każde połączenie. Uwaga: dotyczy to tylko nieudanych połączeń i limitów czasu, nigdy nie dotyczy żądań, na które serwer zwraca odpowiedź.
  • pool_block - Określa, czy pula połączeń ma blokować połączenia.

i nieco poniżej, pochodzi Przykładem

import requests 
s = requests.Session() 
a = requests.adapters.HTTPAdapter(max_retries=3) 
s.mount('http://', a) 

Spróbuj

a = requests.adapters.HTTPAdapter(pool_connections = N, pool_maxsize = M) 

Gdzie N i M są odpowiednie dla swojego programu.

+0

W moim przypadku idealną wartością dla M jest nieskończoność :) Jeśli użyję jakiejś określonej wartości M, to muszę policzyć, ile zgłoszeń zostało wykonanych w tej sesji, a następnie ją odrzucić, prawda? – mnowotka

+0

Czy połączenia są uruchamiane równolegle lub w sekwencji? W jaki sposób około close() jawnie obiektów Response? – andmart

+0

Tylko równolegle. – mnowotka