Je tente de mettre en place Get_Current_user dans la requêteHandler pour Tornado, mais j'ai besoin de l'appel à bloquer lors de l'attente de l'appel asynchrone à ma base de données. Décorer l'appel avec @ Tornado.Web.Asynchrone ne fonctionnera pas car sinon la méthode get_current_user retourne avant la fin de la requête ASYNC et que le rappel de requête est exécuté.
Par exemple: P>
class MyHandler(BaseHandler): @tornado.web.asynchronous @tornado.web.authenticated def get(self): self.write('example') self.finish() class BaseHandler(tornado.web.RequestHandler): def get_current_user(self): def query_cb(self, doc): return doc or None database.get(username='test', password='t3st', callback=query_cb)
3 Réponses :
Faites une opération de base de données de blocage au lieu du non-blocage décrit ci-dessus (il y a un blocage MySQL Lib expédié avec Tornado). P>
de la page wiki de Tornado sur les threads et la concurrence: "Faites-le synchrone et bloquez l'Ioloop. Cela est le plus approprié pour des choses telles que MemCache et les requêtes de base de données qui sont sous votre contrôle et doivent toujours être rapides. Si ce n'est pas rapide, faites-la en ajoutant les index appropriés à la base de données, etc. " p>
https://github.com/facebook/tornado/wiki/Trading- et-concurrence p>
Je demande essentiellement s'il existe un moyen de bloquer au niveau de la tornade, car mon API de base de données pour Couchdb est asynchrone et n'a pas d'appels non bloquants. Je préfère cela pour le reste du site, à l'exception de cette opération unique. C'est pourquoi je demande.
Merci. Je sais que je peux changer de bibliothèques, mais je préfère rester sans blocage de la plupart de mon code. L'autre méthode est définitivement une option, mais crée beaucoup de code dans les gestionnaires, car alors on_auth doit avoir un autre appel ASYNC, etc., etc. Je sais ce que je veux peut ne pas être possible - je ne fais que grimper.
Je pensais que Tornado vous permettait de faire des demandes bloquantes ou non bloquantes. p>
Voici Tornado étant utilisé pour les deux: https: // bitbucket. Org / Néphics / Tornado-Couchdb / SRC / 147579581b47 / Couch.py P>
Disclaimer: Je sais très peu de python et de tornade. p>
Que diriez-vous d'avoir get_current_user code> renvoyer un
futur code> que vous signalez lorsque la réponse asynchrone de votre base de données est renvoyée?