0

所以我重复了我为许多 GET 所做的代码——检查响应是否先前被缓存,如果它可用则返回它。

我想要工作的代码如下所示:

class Handler(web.RequestHandler):

    @gen.coroutine
    def get_cache(self):
        try:
            response = yield gen.Task(get_redis)
        except:
            logging.log()
        if response:
            self.finish(response)
            raise gen.Return()


    @gen.coroutine
    @asynchronous
    def get(self):
        self.get_cache()

        response = do_sql_get()

        self.set_cache(key, response)
        self.finish(response)

现在发生的情况是,如果存在缓存,它会获取缓存,但会继续在self.get. 它这样做对我来说很有意义,但我不确定如何正确重构它,并self.finish在方法中调用它时立即停止self.get_cache

4

1 回答 1

2

get_cache应该返回一个值,表明它是否完成了请求(或者它应该返回缓存的数据并将其留给调用者来完成请求)。我会执行以下操作之一:

@gen.coroutine
def serve_from_cache(self):
  response = yield gen.Task(get_redis)
  if response:
      self.finish(response)
      raise gen.Return(True)
  else:
      raise gen.Return(False)

@gen.coroutine
def get(self):
  if (yield self.serve_from_cache()):
    return
  # do work
  yield self.set_cache(...)

或者

@gen.coroutine
def get_cache(self):
    return yield gen.Task(get_redis)


@gen.coroutine
def get(self):
    resp = yield self.get_cache()
    if resp:
      self.finish(resp)
      return
    # do work...
于 2013-10-03T02:21:48.900 回答