Sto scrivendo il codice per partecipare a un servizio. Ricevo richieste POST a un particolare servizio e avvio l'elaborazione. L'intero processo è piuttosto semplice; I loop attraverso gli elementi nella richiesta e aggiungere ogni elemento al database. Il problema sorgere quando devo elaborare un sacco di oggetti e il ciclo prende come tre minuti per finire, poi, quando provo a rispondere:Errore con il servizio REST che richiede tempo in Python
status = '200 OK'
headers = [('Content-type', 'application/json'),('Access-Control-Allow-Origin','*')]
start_response(status, headers)
return json.dumps(response)
ottengo questo errore:
Exception happened during processing of request from ('XXX.XXX.XXX.XXX', 49172)
Traceback (most recent call last):
File "/usr/local/lib/python2.7/SocketServer.py", line 284, in _handle_request_noblock
self.process_request(request, client_address)
File "/usr/local/lib/python2.7/SocketServer.py", line 310, in process_request
self.finish_request(request, client_address)
File "/usr/local/lib/python2.7/SocketServer.py", line 323, in finish_request
self.RequestHandlerClass(request, client_address, self)
File "/usr/local/lib/python2.7/SocketServer.py", line 640, in __init__
self.finish()
File "/usr/local/lib/python2.7/SocketServer.py", line 693, in finish
self.wfile.flush()
File "/usr/local/lib/python2.7/socket.py", line 303, in flush
self._sock.sendall(view[write_offset:write_offset+buffer_size])
error: [Errno 32] Broken pipe
I don so se questo aiuta, ma la richiesta POST è un POST inoltrato fatto da un browser a un dominio diverso (ecco perché un Access-Control-Allow-Origin) e tutti gli accessi al database sono fatti usando un singolo oggetto che interagisce con il database utilizzando SQLAlchemy (può essere visto come un modello Java EEDAO).
Come evitare questo errore?
possibile duplicato del [errore tubo di Django server di sviluppo rotto] (http://stackoverflow.com/questions/10253288/django-development-server-broken -pipe-error) – miku
Puoi renderlo asincrono. Non appena tutti i dati sono qui, si invia un token che dice che i dati vengono ricevuti e sul lato client è possibile visualizzare un messaggio "Caricamento in corso ...". Fai in modo che il client verifichi periodicamente gli aggiornamenti se i dati hanno terminato il caricamento e, una volta terminato, visualizzi l'ack completo. –
Di solito quando ottengo un errore di pipe rotto, è qualcosa di stupido, come se il client fosse scaduto mentre stavo eseguendo il debug del codice del server. Se il processo richiede più di tre minuti, il processo dovrebbe essere eseguito in modo asincrono e si dovrebbe rispondere confermando che il processo è stato avviato correttamente anziché attendere fino a quando il processo non è stato eseguito per rispondere. –