龙卷风异步处理程序

我正在尝试在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,但始终会收到“无”,因为BaseHandler没有时间做出响应。 有没有办法使用龙卷风来暂时阻止上述呼叫?


做一个阻塞的数据库操作,而不是上面描述的非阻塞(有一个阻塞的mysql lib与龙卷风一起交付)。

在Tornado维基页面中关于线程和并发:“同步并阻止IOLoop,这对于受控制的memcache和数据库查询等应用来说是最合适的,并且应该总是很快,如果速度不快,向数据库添加适当的索引等。“

https://github.com/facebook/tornado/wiki/Threading-and-concurrency


如何让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

我认为Tornado允许你做出阻塞或非阻塞的请求。

这里是两个使用的龙卷风:https://bitbucket.org/nephics/tornado-couchdb/src/147579581b47/couch.py

免责声明:我对Python和龙卷风知之甚少。

链接地址: http://www.djcxy.com/p/4781.html

上一篇: Tornado Asynchronous Handler

下一篇: Jquery Undo last change to DOM