2016-02-09 21 views
8

Possiedo un programma Python che invia richieste di polling lunghe (circa 5-6) in parallelo utilizzando thread diversi per ciascun sondaggio tramite il pacchetto di richieste. E ho capito che alcune delle mie discussioni a volte si bloccano. Quando ciò accade, il server che sto inviando la richiesta non riceve la richiesta. Inoltre ho impostato un timeout sulla richiesta e non funziona.Le richieste Python talvolta si bloccano

try: 
    print("This line prints") 
    response = requests.head(poll_request_url, timeout=180) 
    print("This line does not print when freeze occurs") 
except ReadTimeout: 
    print("Request exception.") 
except RequestException as e: 
    print("Request exception.") 
except Exception: 
    print("Unknown exception.") 
print("This line does not print either when freeze occurs.") 

sto facendo questo su Raspberry Pi 2 hardware con sistema operativo Raspbian.

Ho usato questo stesso programma senza problemi mentre stavo usando Python 2.7. Recentemente sono passato a Python 3.5. Ho provato ad utilizzare entrambe le versioni delle richieste con 2.8.1 e 2.9.1.

Questo problema non si verifica molto frequentemente, ma si verifica 2-3 volte al giorno su thread diversi.

Quale potrebbe essere il problema? Come posso eseguire il debug di questo?

Modifica: il problema viene risolto aggiornando il kernel di Linux.

risposta

5

Secondo la documentazione:

http://docs.python-requests.org/en/master/user/quickstart/#timeouts

Va gettando un'eccezione Timeout, quando il timeout succede. Ciò significherebbe che la linea:

print("This line does not print when freeze occurs") 

sarei mai stato chiamato un timeout che effettivamente accade.

Stai prendendo l'eccezione? O qualsiasi altra eccezione? Potrebbe essere che sia scadente, ma non lo vedi. Forse provare qualcosa del genere:

try: 
    response = requests.head(poll_request_url, timeout=180) 
except requests.exceptions.Timeout: 
    print("Timeout occurred") 

Così puoi vedere se è quello che sta succedendo.

EDIT: probabilmente è il passaggio "connect" che non ha un timeout corretto. Può essere che il grande valore di timeout per il passaggio "connect" lo stia facendo in qualche modo. Magari cercando avente un timeout breve per cui (come indicato qui):

http://docs.python-requests.org/en/master/user/advanced/#timeouts

esempio

response = requests.head(poll_request_url, timeout=(3, 180)) 

In caso contrario potrebbe trattarsi di un problema di ricerca DNS? Forse vedi se l'hardcoding degli IP presenta lo stesso problema?

+3

Sto rilevando tutte le eccezioni incluso Timeout e quando si verifica il timeout, l'eccezione viene rilevata correttamente. È quando il timeout non si verifica e il blocco si verifica, quella linea non viene mai eseguita e non viene generata alcuna eccezione. –

+0

Ho aggiunto un altro contesto al codice per riflettere la gestione delle eccezioni. –

+1

Questo non può scadere durante il passaggio "connect", come dici di non ricevere mai una richiesta sul server. –

1

Risolto il problema con i timer (dal thread di importazione timer). Se non ci sono risultati entro 10 secondi - ripeti, se nessun risultato dopo 10 secondi - stampa "Errore" e vai avanti. Non è possibile monitorare lo stato del timer con l'istruzione if se la richiesta si blocca, ma è possibile farlo attraverso il ciclo while, aggiungendo il tempo se il risultato è ok (Python: Run code every n seconds and restart timer on condition).

Problemi correlati