我正在尝试在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没有时间响应。有没有办法,使用龙卷风,暂时阻止呼叫,如上面的呼叫?
答案 0 :(得分:4)
执行阻塞数据库操作而不是上面描述的非阻塞(龙卷风附带阻塞的mysql库)。
从Tornado wiki页面了解线程和并发性: “同步并阻止IOLoop。这最适合你控制下的memcache和数据库查询,应该总是很快。如果速度不快,可以通过向数据库中添加适当的索引来加快速度。 “
https://github.com/facebook/tornado/wiki/Threading-and-concurrency
答案 1 :(得分:1)
当返回数据库的异步响应时,get_current_user
返回一个Future
信号怎么样?
class BaseHandler(tornado.web.RequestHandler):
def get_current_user(self):
future = Future()
def query_cb(user):
future.set_result(user or None)
database.get(username='test', password='t3st', callback=query_cb)
return future
class MainHandler(BaseHandler):
@gen.coroutine
def get(self):
user = yield self.get_current_user()
self.write('user: ' + user)
# ... actual request processing
答案 2 :(得分:-1)
我认为Tornado允许您发出阻止或非阻止请求。
以下是Tornado用于:https://bitbucket.org/nephics/tornado-couchdb/src/147579581b47/couch.py
免责声明:我对Python和Tornado知之甚少。