13

トルネードを使用しています。非同期のリクエストハンドラがたくさんあります。それらのほとんどは非同期で作業を行い、その作業の結果をユーザーに報告します。しかし、私には1つのハンドラーがあり、その仕事は、ユーザーの要求が将来のある時点で処理されることをユーザーに通知することです。HTTP接続を終了してから、さらに作業を行います。簡単な例を次に示します。

class AsyncHandler(tornado.web.RequestHandler):

    @tornado.web.asynchronous
    def get(self, *args, **kwargs):
        # first just tell the user to go away
        self.write("Your request is being processed.")
        self.finish()

        # now do work
        ...

私の質問は:これはトルネードの合法的な使用ですか?self.finish()の後のコードは確実に実行されますか?これまで問題が発生したことはありませんでしたが、現在、開発環境の1つ(すべてではありません)で問題が発生しています。ここにはすでに特定した回避策がいくつかありますが、トルネードのリクエストライフサイクルの基本的な何かを見逃していないことを確認したいと思います。self.finish()を呼び出した後にコードを実行できなくなる理由はありませんが、間違っている可能性があります。

ありがとう!

4

2 に答える 2

5

はい、後のコードself.finish()は確実に機能します。ただし、2 回呼び出すことはできませんself.finish()。例外が発生します。self.finish()サーバーでのすべての作業が完了する前に、接続を閉じるために使用できます。

しかし、Cole Maclean が言ったように、終了後に重い仕事をしないでください。バックグラウンドで重いタスクを実行する別の方法を探してください。

于 2012-10-03T13:11:42.343 に答える