Как удержать торнадо в асинхронном вызове? - PullRequest
0 голосов
/ 26 декабря 2011

Во время выполнения асинхронного запроса mongodb, подобного приведенному в следующем классе, как этот вызов действительно не блокируется, если у меня все еще есть доступ к аргументу типа self.get_argument ("ip_address") внутри функции обратного вызова?Или я не должен получить доступ к аргументу, как этот, чтобы сохранить асинхронный вызов?

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        app_key = self.get_argument("app_key")

        #async call to mongodb. call _valid_app afterwards
        db.apps.find_one({'app_key': app_key}, callback=self._valid_app);

    def _valid_app(self, response, error):
       if error:
           raise tornado.web.HTTPError(500)

       if response:
           ip_address = self.get_argument("ip_address")
           #rest of the code
       else:
           print("invalid app_key")

1 Ответ

0 голосов
/ 27 декабря 2011

Экземпляр self, на который есть ссылка в функции обратного вызова, будет зависать до конца функции обратного вызова, поэтому self.arguments всегда будет доступен внутри _valid_app.

Возможно, вас может смущатьчто произойдет, если во время асинхронного вызова к Mongo будет сделан другой запрос к тому же обработчику.Это не будет проблемой, потому что для любого нового запроса создается новый экземпляр MainHandler, не мешающий предыдущему.

...