Tornado Async HTTP возвращает результаты постепенно

Насколько я понимаю из документации модуля tornado.gen, tornado.gen.Task состоит из tornado.gen.Callback и tornado.gen.Wait, причем каждая пара Callback/Wait связана с уникальными ключами...

  @tornado.web.asynchronous
  @tornado.gen.engine
  def get(self):
      http_client = AsyncHTTPClient()
      http_client.fetch("http://google.com",
                        callback=(yield tornado.gen.Callback("google")))

      http_client.fetch("http://python.org",
                        callback=(yield tornado.gen.Callback("python")))

      http_client.fetch("http://tornadoweb.org",
                        callback=(yield tornado.gen.Callback("tornado")))
      response = yield [tornado.gen.Wait("google"), tornado.gen.Wait("tornado"), tornado.gen.Wait("python")]

      do_something_with_response(response)
      self.render("template.html")

Таким образом, приведенный выше код получит все ответы с разных URL-адресов. Теперь то, что мне действительно нужно сделать, это вернуть ответ, как только один http _клиент вернет данные. Итак, если «tornadoweb.org» сначала возвращает данные,он должен выполнить self.write (respose ), а цикл в def get ()должен продолжать ждать завершения работы других http _клиентов. Любые идеи о том, как написать это, используя интерфейс tornado.gen.

Очень расплывчатая реализация (и синтаксически неверная )того, что я пытаюсь сделать, будет выглядеть так

class GenAsyncHandler2(tornado.web.RequestHandler):
    @tornado.web.asynchronous
    @tornado.gen.engine
    def get(self):
        http_client = AsyncHTTPClient()
        http_client.fetch("http://google.com",
                          callback=(yield tornado.gen.Callback("google")))

        http_client.fetch("http://python.org",
                          callback=(yield tornado.gen.Callback("python")))

        http_client.fetch("http://tornadoweb.org",
                          callback=(yield tornado.gen.Callback("tornado")))

        while True:
            response = self.get_response()
            if response:
                self.write(response)
                self.flush()
            else:
                break
        self.finish()


    def get_response(self):
        for key in tornado.gen.availableKeys():
            if key.is_ready:
                value = tornado.gen.pop(key)
                return value
        return None
5
задан tshepang 22 February 2014 в 03:53
поделиться