mac - Python Tornado-Solicitud asíncrona está bloqueando
tornado python mac (1)
Los controladores de solicitud son los siguientes:
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()
Cuando GET localhost:8888/test
, la página carga 10 segundos y muestra Awake after 10 seconds
; mientras se carga, si abro localhost:8888/index
en una nueva pestaña del navegador, la nueva página de índice no se bloquea y se carga al instante. Estos se ajustan a mis expectativas.
Sin embargo, mientras se carga la /test
, si abro otra /test
en una nueva pestaña del navegador, se bloquea. El segundo /test
solo comienza a procesarse después de que el primero haya terminado.
¿Qué errores he cometido aquí?
Lo que estás viendo es en realidad una limitación del navegador, no un problema con tu código. TestHandler
un poco de registro adicional a su TestHandler
para dejar esto en claro:
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()
Si abro dos sesiones curl a localhost / test simultáneamente, obtengo esto en el lado del servidor:
Thread starting 1402236952.17
new thread called, sleeping 1402236952.17
Thread starting 1402236953.21
new thread called, sleeping 1402236953.21
Y esto en el lado del cliente:
Awake after 10 seconds! 1402236962.18
Awake after 10 seconds! 1402236963.22
Que es exactamente lo que esperas. Sin embargo, en Chromium, tengo el mismo comportamiento que tú. Creo que Chromium (quizás todos los navegadores) solo permitirá que una conexión a la vez se abra en la misma URL. IndexHandler
esto haciendo que IndexHandler
ejecutara el mismo código que TestHandler
, excepto con mensajes de registro ligeramente diferentes. Aquí está el resultado al abrir dos ventanas del navegador, una para /test
y otra para /index
:
index Thread starting 1402237590.03
index new thread called, sleeping 1402237590.03
Thread starting 1402237592.19
new thread called, sleeping 1402237592.19
Como puede ver, ambos se ejecutaron concurrentemente sin problema.