0

以下に示すように、トルネードを使用して、オートコンプリート サービスを実装するハンドラーを作成するつもりです。

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 時間ごとに実行する予定です。
  • トルネードのドキュメントによると、リクエストごとに新しい RequestHandler オブジェクトが作成されます。したがってtreebuilder、インスタンス属性として持つことは私にとってはうまくいきません。

問題

要するに、どうすればこれを正しく行うことができますか?

インデックスをどこにキャッシュする必要がありますが、トルネードの非ブロック機能はまだありますか? (私は推測します) とindexbuilder同じモジュールの下に置きAutoCompleteHandler、グローバル変数へのインデックスを構築し、別のスレッドを生成して更新タスクを実行することもできますが、それは私には正しく見えず、作業は完了できると思いますトルネードを使用して、構造をよりエレガントにします。

4

1 に答える 1

1

グローバル変数は、私にとって最良/最も単純なソリューションのように思えます。オブジェクトにアタッチすることもできます(グローバルを避けたい場合は、内のようApplicationにアクセスできます。または、インデックスビルダー自体にキャッシュするか、初期化辞書にキャッシュオブジェクトを渡すことができます。self.applicationRequestHandler

いずれにせよ、IOLoop実行中にブロックされないように、別のスレッドで更新を実行することをお勧めします。

于 2014-10-24T16:04:31.177 に答える