2014-06-08 19 views
6

wniosek teleskopowe są następujące:Python Tornado - Asynchronous Zapytanie blokuje

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() 

kiedy dostaję localhost:8888/test, strona ładuje 10 sekund i pokazuje Awake after 10 seconds; podczas ładowania, jeśli otworzę localhost:8888/index w nowej karcie przeglądarki, nowa strona indeksu nie zostanie zablokowana i załadowana natychmiast. Te odpowiadają moim oczekiwaniom.

Jednak podczas ładowania /test, jeśli otworzę inną /test w nowej karcie przeglądarki, zostanie ona zablokowana. Drugi /test rozpoczyna przetwarzanie dopiero po zakończeniu pierwszego.

Jakie błędy tu popełniłem?

Odpowiedz

6

To, co widzisz, jest w rzeczywistości ograniczeniem przeglądarki, a nie problemem z kodem. Dodałem dodatkowe rejestrowanie do TestHandler aby to jasne:

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() 

Jeśli otworzyć dwie sesje skręcania localhost/test jednocześnie, mam to po stronie serwera:

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

I to na strona klienta:

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

Dokładnie tego oczekujesz. Jednak w Chromium mam takie samo zachowanie jak Ty. Myślę, że Chromium (być może wszystkie przeglądarki) zezwoli na otwarcie tylko jednego połączenia na ten sam adres URL. Potwierdziłem to, powodując, że IndexHandler uruchamia ten sam kod co TestHandler, z wyjątkiem nieco innych komunikatów dziennika. Oto wynik po otwarciu dwóch okien przeglądarki, jeden do /test, a jeden do /index:

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

Jak widać zarówno prowadził jednocześnie bez problemu.

+0

Nie mogę uwierzyć, że to jest problem przeglądarki ... Zajęło mi cały dzień, próbując dowiedzieć się, co się stało !! Dzięki wielkie! –

+0

To doprowadzało mnie do szaleństwa przez godzinę. – xyres

Powiązane problemy