Ответы пользователя по тегу Асинхронное программирование
  • Как понимать асинхронность в Tornado?

    @ykalchevskiy
    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.

    Вот эту страничку нужно обязательно прочитать.
    Ответ написан
    Комментировать