Al hacer una consulta asíncrona mongodb como la de la siguiente clase, ¿cómo es que esta llamada realmente no se bloquea si todavía tengo acceso a un argumento como self.get_argument ("ip_address") dentro de la función de devolución de llamada? ¿O no debería acceder al argumento de esta manera para mantener la llamada asíncrona?

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")
0
osoner 26 dic. 2011 a las 23:37

1 respuesta

La mejor respuesta

La instancia self a la que se hace referencia en la función de devolución de llamada estará pendiente hasta el final de la función de devolución de llamada, por lo tanto, self.arguments siempre estará disponible dentro de _valid_app.

Tal vez pueda confundirse con lo que sucedería si se hiciera otra solicitud al mismo controlador durante la llamada asíncrona a Mongo. Esto no sería un problema porque, para cualquier solicitud nueva, se crea una nueva instancia de MainHandler, que no interfiere con la anterior.

0
lbolla 27 dic. 2011 a las 02:16