相关疑难解决方法(0)

龙卷风异步处理程序

我试图在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)
Run Code Online (Sandbox Code Playgroud)

@ tornado.web.authenticated调用get_current_user,但始终收到"None",因为BaseHandler没有时间响应.有没有办法,使用龙卷风,暂时阻止呼叫,如上面的呼叫?

asynchronous tornado requesthandler

7
推荐指数
1
解决办法
7450
查看次数

Tornado异步HTTP以递增方式返回结果

据我所知,来自tornado.gen模块的文件是tornado.gen.Task包含tornado.gen.Callback和tornado.gen.Wait,每个Callback/Wait对与唯一键相关联......

  @tornado.web.asynchronous
  @tornado.gen.engine
  def get(self):
      http_client = AsyncHTTPClient()
      http_client.fetch("http://google.com",
                        callback=(yield tornado.gen.Callback("google")))

      http_client.fetch("http://python.org",
                        callback=(yield tornado.gen.Callback("python")))

      http_client.fetch("http://tornadoweb.org",
                        callback=(yield tornado.gen.Callback("tornado")))
      response = yield [tornado.gen.Wait("google"), tornado.gen.Wait("tornado"), tornado.gen.Wait("python")]

      do_something_with_response(response)
      self.render("template.html")
Run Code Online (Sandbox Code Playgroud)

因此,上面的代码将获得来自不同URL的所有响应.现在我真正需要完成的是一旦http_client返回数据就返回响应.因此,如果'tornadoweb.org'首先返回数据,它应该执行self.write(respose),并且def get()中的循环应该等待其他http_clients完成.有关如何使用tornado.gen接口编写此内容的任何想法.

我试图做的非常模糊的实现(和语法错误)将是这样的

class GenAsyncHandler2(tornado.web.RequestHandler):
    @tornado.web.asynchronous
    @tornado.gen.engine
    def get(self):
        http_client = AsyncHTTPClient()
        http_client.fetch("http://google.com",
                          callback=(yield tornado.gen.Callback("google")))

        http_client.fetch("http://python.org",
                          callback=(yield tornado.gen.Callback("python")))

        http_client.fetch("http://tornadoweb.org",
                          callback=(yield tornado.gen.Callback("tornado")))

        while True:
            response = self.get_response()
            if response:
                self.write(response)
                self.flush()
            else:
                break
        self.finish()


    def get_response(self):
        for key in tornado.gen.availableKeys():
            if key.is_ready:
                value = tornado.gen.pop(key)
                return value
        return None
Run Code Online (Sandbox Code Playgroud)

python asynchronous tornado

5
推荐指数
1
解决办法
3965
查看次数

标签 统计

asynchronous ×2

tornado ×2

python ×1

requesthandler ×1