因此,我为许多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
后立即重新停止它。
答案 0 :(得分: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...