【问题标题】:Tornado Asynchronous HandlerTornado 异步处理程序
【发布时间】:2011-06-23 18:13:28
【问题描述】:

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

【问题讨论】:

    标签: asynchronous tornado requesthandler


    【解决方案1】:

    执行阻塞数据库操作而不是上述非阻塞操作(tornado 附带了一个阻塞 mysql 库)。

    来自关于线程和并发的 Tornado wiki 页面: “同步执行并阻止 IOLoop。这最适合您控制的内存缓存和数据库查询之类的事情,并且应该始终快速。如果速度不快,请通过向数据库中添加适当的索引等来提高速度。 "

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

    【讨论】:

    • 我基本上是在问是否有办法在龙卷风级别进行阻塞,因为我的 couchdb 数据库 api 是异步的并且没有非阻塞调用。除了这个单一的操作,我更喜欢站点的其余部分。这就是我问的原因。
    • 谢谢。我知道我可以切换库,但我更喜欢在我的大部分代码中保持非阻塞。另一种方法绝对是一种选择,但会在处理程序中创建大量代码,因为那时 on_auth 必须进行另一个异步调用,等等。我知道我想要的可能是不可能的——我只是在咆哮。跨度>
    【解决方案2】:

    我认为 Tornado 允许您发出阻塞或非阻塞请求。

    Tornado 用于两者:https://bitbucket.org/nephics/tornado-couchdb/src/147579581b47/couch.py

    免责声明:我对 Python 和 Tornado 知之甚少。

    【讨论】:

      【解决方案3】:

      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
      

      【讨论】:

        猜你喜欢
        • 2012-05-20
        • 1970-01-01
        • 1970-01-01
        • 2011-12-31
        • 2015-06-07
        • 1970-01-01
        • 1970-01-01
        • 2018-06-08
        • 1970-01-01
        相关资源
        最近更新 更多