龙卷风异步处理程序

时间:2011-02-08 21:51:38

标签: asynchronous tornado requesthandler

我正在尝试在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没有时间响应。有没有办法,使用龙卷风,暂时阻止呼叫,如上面的呼叫?

3 个答案:

答案 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知之甚少。