首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Tornado异步处理程序

Tornado异步处理程序
EN

Stack Overflow用户
提问于 2011-02-09 05:51:38
回答 3查看 8.3K关注 0票数 8

我正尝试在Tornado的RequestHandler中实现get_current_user,但我需要在等待对数据库的异步调用时阻塞调用。使用@tornado.web.asynchronous修饰调用将不起作用,因为无论哪种方式,get_current_user方法都会在异步查询完成和执行查询回调之前返回。

例如:

代码语言:javascript
复制
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没有时间响应。有没有办法,使用龙卷风,暂时阻止像上面这样的呼叫?

EN

回答 3

Stack Overflow用户

发布于 2011-02-09 06:18:15

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

在Tornado wiki关于线程和并发的页面上:“同步地做,阻塞IOLoop。这最适合于像memcache和数据库查询这样的事情,在你的控制下,应该总是快速的。如果它不快,通过向数据库添加适当的索引来使其更快,等等。”

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

票数 4
EN

Stack Overflow用户

发布于 2017-09-02 07:12:28

如果让get_current_user返回一个Future,并在返回来自数据库的异步响应时用信号通知该your,会怎么样?

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2011-07-19 22:50:04

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

下面是两者都用到的Tornado:https://bitbucket.org/nephics/tornado-couchdb/src/147579581b47/couch.py

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

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4938902

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档