Asynchronous Tornado异步处理程序

Asynchronous Tornado异步处理程序,asynchronous,tornado,requesthandler,Asynchronous,Tornado,Requesthandler,我试图在Tornado的RequestHandler中实现get_current_user,但在等待对数据库的异步调用时,我需要阻塞调用。用@tornado.web.asynchronous修饰调用将不起作用,因为无论哪种方式,get\u current\u user方法都会在异步查询完成和执行查询回调之前返回 例如: class MyHandler(BaseHandler): @tornado.web.asynchronous @tornado.web.authenticated

我试图在Tornado的RequestHandler中实现get_current_user,但在等待对数据库的异步调用时,我需要阻塞调用。用@tornado.web.asynchronous修饰调用将不起作用,因为无论哪种方式,get\u current\u 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调用获取当前用户,但始终接收“无”,因为BaseHandler没有时间响应。有没有一种方法可以使用tornado临时阻止上述调用?

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

在Tornado wiki页面中,关于线程和并发: 同步执行此操作并阻止IOLoop。这最适用于memcache和数据库查询等在您控制下的事情,并且应该总是快速的。如果不快速,请通过向数据库添加适当的索引等方式使其快速


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

以下是Tornado在这两方面的应用:


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

get\u current\u user
返回一个
Future
,当数据库的异步响应返回时,您会发出信号,怎么样

类BaseHandler(tornado.web.RequestHandler):
def get_当前_用户(自身):
future=future()
def查询_cb(用户):
future.set_结果(用户或无)
get(username='test',password='t3st',callback=query\u cb)
回归未来
类MainHandler(BaseHandler):
@科罗廷将军
def get(自我):
user=yield self.get\u current\u user()
self.write('用户:'+用户)
# ... 实际请求处理

我基本上是在问是否有办法在tornado级别进行阻塞,因为我的couchdb数据库api是异步的,没有非阻塞调用。我更喜欢这个网站的其余部分,除了这个单一的操作。这就是我问的原因。谢谢。我知道我可以切换库,但我更喜欢在大部分代码中保持非阻塞。另一个方法肯定是一个选项,但会在处理程序中创建大量代码,因为on_auth必须有另一个异步调用,等等。我知道我想要的可能不可能——我只是在咆哮。