我打算用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小时运行一次以刷新索引列表。treebuilder
作为实例属性对我来说不起作用。简而言之,我该怎么做呢?
我应该在哪里缓存索引,但仍然具有龙卷风的非阻塞功能? (我猜)我可以将indexbuilder
置于与AutoCompleteHandler
相同的模块下,并将索引构建为全局变量,并生成一个单独的线程来执行刷新任务,但这看起来并不正确对我而言,我认为可以使用龙卷风完成这项工作,使结构更加优雅。
答案 0 :(得分:0)
对我来说,全局变量听起来像是最好/最简单的解决方案。您还可以将其附加到Application
对象(如果您希望避免使用全局,可以在self.application
中作为RequestHandler
访问。或者您可以将其缓存在indexbuilder本身上,或者在初始化字典中传递一些缓存对象。
在任何情况下,您可能都希望在单独的线程中进行刷新,以避免在IOLoop
运行时阻止它。