我正尝试在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没有时间响应。有没有办法,使用龙卷风,暂时阻止像上面这样的呼叫?
发布于 2011-02-09 06:18:15
执行阻塞数据库操作,而不是上面描述的非阻塞操作(tornado附带了一个阻塞mysql lib )。
在Tornado wiki关于线程和并发的页面上:“同步地做,阻塞IOLoop。这最适合于像memcache和数据库查询这样的事情,在你的控制下,应该总是快速的。如果它不快,通过向数据库添加适当的索引来使其更快,等等。”
https://github.com/facebook/tornado/wiki/Threading-and-concurrency
发布于 2017-09-02 07:12:28
如果让get_current_user返回一个Future,并在返回来自数据库的异步响应时用信号通知该your,会怎么样?
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发布于 2011-07-19 22:50:04
我以为Tornado允许您发出阻塞或非阻塞请求。
下面是两者都用到的Tornado:https://bitbucket.org/nephics/tornado-couchdb/src/147579581b47/couch.py
声明:我对Python和Tornado知之甚少。
https://stackoverflow.com/questions/4938902
复制相似问题