Uso Tornado, ho una richiesta GET che richiede molto tempo in quanto rende molte richieste a un altro servizio web ed elabora i dati, potrebbe richiedere alcuni minuti per completare pienamente. Non voglio che questo blocchi l'intero server web dal rispondere ad altre richieste, che attualmente fa.Tornado blocco richieste asincrone
Da quanto ho capito, Tornado è a singolo thread ed esegue ogni richiesta in modo sincrono, anche se li gestisce in modo asincrono (ancora confuso su quel po '). Ci sono parti del processo lungo che potrebbero essere punti di pausa per consentire al server di gestire altre richieste (possibile soluzione?). Lo sto eseguendo su Heroku con un solo operatore, quindi non sono sicuro di come questo si traduca nella generazione di un nuovo thread o multiprocessing, che non ho esperienza con Python.
Qui è quello che sto cercando di fare: il client effettua la chiamata ottenere per avviare il processo, poi ho ciclo attraverso un altro ottenere chiamare ogni 5 secondi per verificare lo stato e aggiornare la pagina con le nuove informazioni (polling lungo sarebbe funziona anche se si trova nello stesso problema). Il problema è che l'avvio del processo lungo blocca tutte le nuove richieste di acquisizione (o nuove sessioni di polling lunghe) fino al completamento.
C'è un modo semplice per dare il via questo arrivare a lungo chiamare e non averlo bloccare l'intero server Web nel processo? C'è qualcosa che posso inserire nel codice per dire ... "pausa, vai a gestire le richieste in sospeso e poi continua"?
Ho bisogno di avviare una richiesta GET sulla ProcessHandler. Devo quindi continuare a essere in grado di interrogare StatusHandler mentre ProcessHandler è in esecuzione.
Esempio:
class StatusHandler(tornado.web.RequestHandler):
@tornado.web.asynchronous
def get(self):
self.render("status.html")
class ProcessHandler(tornado.web.RequestHandler):
@tornado.web.asynchronous
def get(self):
self.updateStatus("0")
result1 = self.function1()
self.updateStatus("1")
result2 = self.function2(result1)
self.updateStatus("2")
result3 = self.function3(result2)
self.updateStatus("3")
self.finish()
Hai provato il modulo tornado.gen? http://www.tornadoweb.org/documentation/gen.html –
ti sei ricordato di annotare come una chiamata asincrona: aggiungi: @asynchronous sui tuoi metodi GET –
eyboot sì, ho @asynchronous sui miei metodi GET – JeffG