tornado.gen.coroutine +
yield != асинхронность.
Вызовы, которые делаются должны уметь работать асинхронно. Смотрим
здесь первый пример:
class AsyncHandler(RequestHandler):
@asynchronous
def get(self):
http_client = AsyncHTTPClient()
http_client.fetch("http://example.com",
callback=self.on_fetch)
def on_fetch(self, response):
do_something_with_response(response)
self.render("template.html")
Метод
fetch объекта класса
AsyncHTTPClient -- асинхронный. На это указывает аргумент callback (и название класса, конечно :)). Когда страница будет получена, вызовется _on_fetch. Как и в AJAX.
Пример ниже на этой же странице -- это переписанная версия того же самого, просто красивее, без лапши коллбеков. Для этого и нужна пара
tornado.gen.coroutine +
yield.
Вызов
time.sleep(2) блокирует весь
ioloop, вместо него можно воспользоваться чем-то типа
yield tornado.gen.Task(tornado.ioloop.IOLoop.current().add_timeout, time.time() + 2)
Но даже заменив эту строку, асинхронности не будет заметна. Это связано с ограничениями браузеров: они не умеют одновременно открывать одну и туже вкладку. Поэтому нужно открыть вкладки в разных браузерах.
Еще одно: декоратор
@tornado.web.asynchronous не нужен при использовании
@tornado.gen.coroutine.
Вот эту страничку нужно обязательно прочитать.