Tornadoを使用すると、別のWebサービスに多くのリクエストを送信してデータを処理するため、Getリクエストに時間がかかり、完全に完了するまでに数分かかる場合があります。これにより、Webサーバー全体が他の要求に応答するのをブロックしたくありません。
私が理解しているように、Tornadoはシングルスレッドであり、非同期で処理しますが、各要求を同期的に実行します(そのビットではまだ混乱しています)。サーバーが他の要求を処理できるようにするための一時停止ポイントになる可能性のある長いプロセスの一部があります(可能な解決策?)。私は単一のワーカーを使用してHerokuで実行しているので、Pythonでの経験がない新しいスレッドやマルチプロセッシングの生成にどのように変換されるかわかりません。
これが私がやろうとしていることです:クライアントはプロセスを開始するためにget呼び出しを行い、次に5秒ごとに別のget呼び出しをループしてステータスを確認し、新しい情報でページを更新します(長いポーリングも機能しますが実行中です)同じ問題に)。問題は、長いプロセスを開始すると、完了するまですべての新しいget要求(または新しい長いポーリングセッション)がブロックされることです。
この長いget呼び出しを開始し、その過程でWebサーバー全体をブロックしないようにする簡単な方法はありますか?コードに入力して、「一時停止し、保留中のリクエストを処理してから続行する」と言うことができるものはありますか?
ProcessHandlerでgetリクエストを開始する必要があります。次に、ProcessHandlerの実行中にStatusHandlerを照会できるようにする必要があります。
例:
class StatusHandler(tornado.web.RequestHandler):
@tornado.web.asynchronous
def get(self):
self.render("status.html")
class ProcessHandler(tornado.web.RequestHandler):
@tornado.web.asynchronous
def get(self):
self.updateStatus("0")
result1 = self.function1()
self.updateStatus("1")
result2 = self.function2(result1)
self.updateStatus("2")
result3 = self.function3(result2)
self.updateStatus("3")
self.finish()