2014-05-13 11 views
11

Sto utilizzando le richieste di Python Library con sessioni:Nella libreria delle richieste, come posso evitare l'avviso "HttpConnectionPool è pieno, scartando la connessione"?

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

E a volte mi sto questo avvertimento nei miei ceppi:

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

La mia domanda è: perché questo sta avvertendo e non un'eccezione ?

Questo è il codice responsabile di questo (da 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) 

Perché questa eccezione viene catturato qui? Se è stato controrilanciato, ho potuto gestire questa eccezione nel mio codice, creando una nuova sessione e cancellando quella vecchia.

Se si tratta solo di un avviso, significa che non influisce in alcun modo sui miei risultati? Posso ignorarlo? In caso contrario, come posso gestire questa situazione?

+1

hai provato a impostare 'self.block' su' True'? – roippi

+1

Desidero davvero che le mie richieste vengano bloccate? Forse questo avvertimento sparirà ma ci sono altre conseguenze? C'è qualche ragione per cui questo non è Vero di default, giusto? – mnowotka

+0

': param block: Se impostato su True, non verranno utilizzate più di ** connessioni ** maxsize alla volta. Se non sono disponibili connessioni libere, la chiamata verrà bloccata fino al rilascio di una connessione. – roippi

risposta

6

dalle richieste di documenti in http://docs.python-requests.org/en/latest/api/

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

L'adattatore incorporato HTTP per urllib3.

Fornisce un'interfaccia generica per le sessioni Richieste per contattare gli URL HTTP e HTTPS implementando l'interfaccia di trasporto . Questa classe verrà solitamente creata dalla classe Session sotto le copertine.

Parametri:

  • pool_connections - Il numero di pool di connessione urllib3 da memorizzare nella cache.
  • pool_maxsize: il numero massimo di connessioni da salvare nel pool.
  • max_retries (int): il numero massimo di tentativi che ogni connessione deve tentare. Nota, questo si applica solo alle connessioni e ai timeout falliti, mai alle richieste in cui il server restituisce una risposta.
  • pool_block - Se il pool di connessioni deve bloccare per le connessioni.

e un po 'al di sotto, arriva un esempio

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

Prova questo

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

Dove N ed M sono adatti per il programma.

+0

Nel mio caso, il valore ideale per M è infinito :) Se utilizzo un valore specifico di M, allora devo contare quante richieste sono state fatte in questa sessione e poi scartarla, giusto? – mnowotka

+0

Accendi connessioni in parallelo o in sequenza? Che ne dici di close() esplicitamente oggetti di risposta? – andmart

+0

Solo in parallelo. – mnowotka

Problemi correlati