asynchronous - Tornado 异步处理程序

标签 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 没有时间响应。有没有办法使用 Tornado 来临时阻止诸如上面的调用?

最佳答案

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

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

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

关于asynchronous - Tornado 异步处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4938902/

相关文章:

java - 如何以jsp页面而不是xml格式显示solr的结果?

c# - 具有完成事件的异步方法

php - 在 PHP 中使用正则表达式作为请求处理程序是否不好?

java - CompletableFuture - 提供一个将 bool 值返回给 SupplyAsync 调用的方法

python - mysql 中的同一行(nginx+tornado+mysqldb)

python - Tornado 可以根据 Content-Type header 进行不同的路由吗?

python - 使用 "tornado.httpclient"获取 "POST https"站点获取 "HTTPError: HTTP 599"

Spring @Async 生成 LazyInitializationExceptions

javascript - 异步 JavaScript 程序中的函数调用到底是如何排序的?