Задача блокировки потока Tornado

Может кто-нибудь помочь мне решить эту проблему. Вот мой код:

class Handler(RequestHandler):
@asynchronous    
def get(self):
    res = 'result '
    _t = threading.Thread(target=self._thread, args=(res,))
    print _t, time.time()
    _t.start()

def _thread(self, response):
    time.sleep(5)
    IOLoop.instance().add_callback(callback=lambda: self.print_response(response))

def print_response(self, _response):
    self.write(_response)
    self.finish()

application = Application([
     (r'/', Handler),
])
if __name__ == '__main__':
application.listen(8889)
    IOLoop.instance().start()

В браузере посетите localhost:8889 на одной вкладке и localhost:8889 на другой: я увижу, что «результат» не печатается на второй вкладке, пока не завершится первая, через 5 секунд. Я думаю, что я создал 2 потока параллельной обработки, а когда закончил, add_callback привел к основному циклу. Tab2 должен иметь результаты вскоре после завершения tab1 ??? Если я скопирую класс Handle в класс Handle1, добавив маршрут r'/1', Handle1. Попробуйте еще раз, localhost:8889 и localhost:8889/1 ---> Все будет в порядке. Любой может объяснить мне эту проблему и как ее решить. Спасибо!


person Dwind    schedule 17.03.2014    source источник


Ответы (1)


Это не торнадо, это браузер. Браузеры не любят делать несколько запросов на одно и то же, поэтому они не будут отправлять второй запрос, пока первый не завершится. Если вы используете два разных браузера (или разные URL-адреса), вы увидите, что это работает.

person Ben Darnell    schedule 17.03.2014
comment
О, верно. Прости, я не подумал об этом случае! Спасибо :) - person Dwind; 17.03.2014