Ho codice per la lettura di un URL simile a questo:Leggi timeout utilizzando urllib2 o qualsiasi altra libreria http
from urllib2 import Request, urlopen
req = Request(url)
for key, val in headers.items():
req.add_header(key, val)
res = urlopen(req, timeout = timeout)
# This line blocks
content = res.read()
Il timeout lavora per la chiamata urlopen(). Ma poi il codice arriva alla chiamata res.read() dove voglio leggere i dati di risposta e il timeout non è applicato lì. Quindi la chiamata in lettura potrebbe bloccarsi quasi in attesa di dati dal server. L'unica soluzione che ho trovato è di usare un segnale per interrompere la lettura() che non è adatta a me dal momento che sto usando thread.
Quali altre opzioni ci sono? Esiste una libreria HTTP per Python che gestisce i timeout di lettura? Ho esaminato httplib2 e le richieste e sembrano soffrire lo stesso problema di cui sopra. Non voglio scrivere il mio codice di rete non bloccante usando il modulo socket perché penso che ci dovrebbe essere già una libreria per questo.
Aggiornamento: Nessuna delle soluzioni seguenti lo sta facendo per me. Si può vedere di persona che l'impostazione della presa o timeout urlopen non ha effetto quando si scarica un file di grandi dimensioni:
from urllib2 import urlopen
url = 'http://iso.linuxquestions.org/download/388/7163/http/se.releases.ubuntu.com/ubuntu-12.04.3-desktop-i386.iso'
c = urlopen(url)
c.read()
Almeno su Windows con Python 2.7.3, i timeout vengono completamente ignorati.
relativo al totale * timeout di connessione *: [HTTPConnection.request non rispetta il timeout?] (Http://stackoverflow.com/q/28669744/4279) – jfs