我正在尝试在 Tornado 的 RequestHandler 中实现 get_current_user,但我需要在等待对我的数据库的异步调用时阻塞调用。使用 @tornado.web.asynchronous 装饰调用将不起作用,因为无论哪种方式 get_current_user 方法都会在异步查询完成并执行查询回调之前返回。
例如:
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)
@tornado.web.authenticated 调用 get_current_user,但总是收到“None”,因为 BaseHandler 没有时间响应。有没有办法使用 Tornado 来临时阻止诸如上面的调用?
最佳答案
执行阻塞数据库操作,而不是上述非阻塞操作(tornado 附带一个阻塞的 mysql 库)。
从 Tornado wiki 页面关于线程和并发:
“同步执行并阻止 IOLoop。这最适合于诸如内存缓存和数据库查询之类的在您的控制之下并且应该始终快速的事情。如果它不快,请通过向数据库添加适当的索引等来使其快速。 ”
https://github.com/facebook/tornado/wiki/Threading-and-concurrency
关于asynchronous - Tornado 异步处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4938902/