我打算使用 tornado 编写一个实现自动完成服务的处理程序,如下所示:
class AutoCompleteHandler(tornado.web.RequestHandler):
def initialize(self, indexbuilder):
self.indexbuilder = indexbuilder
self.index = indexbuilder.build_merged_index()
def get(self):
query = self.get_argument('q')
result = self.index[query]
self.set_header("Content-Type", 'application/json;')
self.set_header('charset', "utf-8")
self.write(json.dumps(result))
事实和要求
- 这
wordtreebuilder.build_merged_index
是一种极其缓慢的方法,计划每 24 小时运行一次以刷新索引列表。 - 根据 tornado 文档,每个请求都会创建一个新的 RequestHandler 对象。所以拥有
treebuilder
作为实例属性对我不起作用。
问题
简而言之,我怎样才能做到这一点?
我应该在哪里缓存索引,但仍然具有龙卷风的非阻塞功能?(我猜)我可以放在indexbuilder
与 相同的模块下AutoCompleteHandler
并构建全局变量的索引,并生成一个单独的线程来执行刷新任务,但这对我来说看起来不正确,我认为这项工作可以完成使用龙卷风并使结构更加优雅。