2012-03-19 17 views
6

Il mio codice è rimasto bloccato in questa chiamata di funzione:feedparser con timeout

feedparser.parse("http://...") 

Ciò ha funzionato prima. L'URL non è nemmeno possibile aprire nel browser. Come cureresti questo caso? C'è una possibilità di timeout? Mi piacerebbe continuare come se nulla potesse accadere (solo con la stampa di alcuni messaggi o registrare questo problema)

risposta

11

È possibile specificare il timeout a livello globale utilizzando socket.setdefaulttimeout().

Il timeout può limitare la durata di un'operazione presa individuo può durare - feedparser.parse() possono eseguire molte operazioni socket e quindi il tempo totale trascorso su DNS, stabilire la connessione TCP, l'invio/ricezione di dati può essere molto più lungo. Vedi Read timeout using either urllib2 or any other http library.

+0

OK, l'ho usato, ma non so se funziona perché l'URL con infinita di carico è di nuovo attiva. – xralf

6

Usa Python requests biblioteca per la rete IO, feedparser per l'analisi solo:

# Do request using requests library and timeout 
try: 
    resp = requests.get(rss_feed, timeout=20.0) 
except requests.ReadTimeout: 
    logger.warn("Timeout when reading RSS %s", rss_feed) 
    return 

# Put it to memory stream object universal feedparser 
content = BytesIO(resp.content) 

# Parse content 
feed = feedparser.parse(content)