2014-05-13 18 views
11

Ich verwende Python-Anfragen Bibliothek Sitzungen:In Requests-Bibliothek, wie kann ich vermeiden "HttpConnectionPool ist voll, Verwerfen der Verbindung" Warnung?

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

Und manchmal erhalte ich diese Warnung in meinem Logs:

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

Meine Frage ist: warum diese Warnung und nicht eine Ausnahme ?

Dies ist der Code für diese (von 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) 

Warum diese Ausnahme hier gefangen ist? Wenn es erneut geraist wurde, konnte ich diese Ausnahme in meinem Code behandeln, indem ich eine neue Sitzung erstellte und die alte löschte.

Wenn es nur eine Warnung ist, bedeutet es, dass es meine Ergebnisse in keiner Weise beeinflusst? Kann ich es ignorieren? Wenn nicht, wie kann ich mit dieser Situation umgehen?

+1

haben Sie versucht, 'self.block' auf' True' zu ​​setzen? – roippi

+1

Will ich wirklich meine Anfragen blockieren? Vielleicht wird diese Warnung verschwinden, aber gibt es noch andere Konsequenzen? Es gibt einen Grund, warum das nicht standardmäßig True ist, oder? – mnowotka

+0

': Parameter Block: Wenn auf True gesetzt, werden nicht mehr als ** maxsize ** Verbindungen gleichzeitig verwendet. Wenn keine freien Verbindungen verfügbar sind, wird der Anruf blockiert, bis eine Verbindung freigegeben wurde. – roippi

Antwort

6

Von Anfragen docs 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) 

Der eingebaute HTTP-Adapter für urllib3.

Stellt eine allgemeine Schnittstelle für Requests-Sitzungen bereit, um HTTP- und HTTPS-URLs durch Implementieren der Transportadapterschnittstelle zu kontaktieren. Diese Klasse wird normalerweise von der Session-Klasse unter den Covern erstellt.

Parameter:

  • pool_connections - Die Anzahl der urllib3 Verbindungspools zu Cache.
  • pool_maxsize - Die maximale Anzahl der Verbindungen, die im Pool gespeichert werden sollen.
  • max_retries (int) - Die maximale Anzahl von Wiederholungsversuchen, die jede Verbindung versuchen sollte. Beachten Sie, dass dies nur für fehlgeschlagene Verbindungen und Timeouts gilt, niemals für Anforderungen, bei denen der Server eine Antwort zurückgibt.
  • pool_block - Ob der Verbindungspool für Verbindungen blockiert werden soll.

und ein wenig weiter unten kommt ein Beispiel

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

Versuchen Sie, diese

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

Wo N und M für Ihr Programm geeignet sind.

+0

In meinem Fall ist der ideale Wert für M unendlich. Wenn ich einen bestimmten Wert von M verwende, dann muss ich zählen, wie viele Anfragen in dieser Sitzung gemacht wurden, und dann verwerfen, oder? – mnowotka

+0

Brennen Sie Verbindungen parallel oder nacheinander? Wie wäre es mit close() explizit Response-Objekten? – andmart

+0

Nur parallel. – mnowotka