2014-06-08 12 views
6

La gestori delle richieste sono le seguenti:Python Tornado - asincrona richiesta sta bloccando

class TestHandler(tornado.web.RequestHandler): # localhost:8888/test 
    @tornado.web.asynchronous 
    def get(self): 
     t = threading.Thread(target = self.newThread) 
     t.start() 

    def newThread(self): 
     print "new thread called, sleeping" 
     time.sleep(10) 
     self.write("Awake after 10 seconds!") 
     self.finish() 

class IndexHandler(tornado.web.RequestHandler):   # localhost:8888/ 
    def get(self): 
     self.write("It is not blocked!") 
     self.finish() 

Quando ottengo localhost:8888/test, la pagina viene caricata 10 secondi e mostra Awake after 10 seconds; durante il caricamento, se apro localhost:8888/index in una nuova scheda del browser, la nuova pagina indice non viene bloccata e caricata immediatamente. Questi si adattano alle mie aspettative.

Tuttavia, mentre il /test si sta caricando, se apro un altro /test in una nuova scheda del browser, è bloccato. Il secondo /test inizia l'elaborazione solo al termine del primo.

Quali errori ho fatto qui?

risposta

6

Quello che stai vedendo è in realtà una limitazione del browser, non un problema con il tuo codice. Ho aggiunto un po 'di registrazione supplementare al vostro TestHandler a chiarire questo punto:

class TestHandler(tornado.web.RequestHandler): # localhost:8888/test 
    @tornado.web.asynchronous 
    def get(self): 
     print "Thread starting %s" % time.time() 
     t = threading.Thread(target = self.newThread) 
     t.start() 

    def newThread(self): 
     print "new thread called, sleeping %s" % time.time() 
     time.sleep(10) 
     self.write("Awake after 10 seconds!" % time.time()) 
     self.finish() 

Se apro due sessioni ricciolo a localhost/test contemporaneamente, ottengo questo sul lato server:

Thread starting 1402236952.17 
new thread called, sleeping 1402236952.17 
Thread starting 1402236953.21 
new thread called, sleeping 1402236953.21 

E questo su lato client:

Awake after 10 seconds! 1402236962.18 
Awake after 10 seconds! 1402236963.22 

Quale è esattamente ciò che ci si aspetta. Tuttavia in Chromium, ho lo stesso comportamento di te. Penso che Chromium (forse tutti i browser) consentirà solo una connessione alla volta di essere aperta allo stesso URL. Ho confermato questo facendo sì che lo IndexHandler esegua lo stesso codice di TestHandler, tranne che con messaggi di registro leggermente diversi. Ecco l'output quando si aprono due finestre del browser, uno per /test, e uno a /index:

index Thread starting 1402237590.03 
index new thread called, sleeping 1402237590.03 
Thread starting 1402237592.19 
new thread called, sleeping 1402237592.19 

Come si può vedere sia corse contemporaneamente senza alcun problema.

+0

Non posso credere che questo sia il problema del browser .... Mi ci è voluto un giorno intero a cercare di capire cosa è successo !! Grazie mille! –

+0

Questo mi stava facendo impazzire per un'ora ora. – xyres

Problemi correlati