私は、実行に10分以上かかるレポートを要求するWebアプリケーションを持っています。パフォーマンスを向上させることは別として、スレッドを設定してレポートを実行してユーザーにメールを送信し、その決定メッセージを直ちにユーザーに返します。cherrypyのMonitorを使って1つのタスクを実行して停止する方法はありますか?
(周波数パラメータをどうするか?)私はcherrypy.process.plugins.Monitorを見てきたが、それは正しい選択である場合、私は明確ではないよ
私は、実行に10分以上かかるレポートを要求するWebアプリケーションを持っています。パフォーマンスを向上させることは別として、スレッドを設定してレポートを実行してユーザーにメールを送信し、その決定メッセージを直ちにユーザーに返します。cherrypyのMonitorを使って1つのタスクを実行して停止する方法はありますか?
(周波数パラメータをどうするか?)私はcherrypy.process.plugins.Monitorを見てきたが、それは正しい選択である場合、私は明確ではないよ
モニターが正しい選択ではありません。同じタスクを繰り返し実行するためのものです。おそらくちょうどthreading.Thread(target=run_report).start()
に電話する方が良いでしょう。 202 Accepted
をユーザーに返信し、クライアントがステータスを監視したり、新しく作成されたレポートリソースを取得できるようにするためのURLを用意します。
これは、cherrypy.engineが停止したときに新しいスレッドを正常にシャットダウンしたい場合があることです。バス上の「停止」チャンネルに接続する方法の例については、さまざまなプラグインを見てください。もう1つのオプションは、スレッドが異常終了するかどうか気にしない場合、スレッドをデーモンにすることです。
fumanchuの答えに同意のほかに、私は周波数パラメータは、実際に秒単位で表さ期間であることを追加したいと思います。 cherrypy.process.plugins.Monitor
(この名前は誤解を招く)
可能な別の解決策は、定期的に実行されるモニタと、完了を定期的にチェックすることができる作業計算のセットとを有することができる。
check
事項の計算時間:コードが class Scheduler:
def __init__ (self):
self.lock = threading.Lock()
self.mon = Monitor(cherrypy.engine, check_computations, frequency=whatever)
self.mon.start()
self.computations = list() # on which we append stuff
def check_computations (self):
with self.lock:
for i in self.computations:
check(i) # Single check function
警告のようなものになるだろう。あなたがロックを使用する方法に注意してください。このperioicルーチン
computations
リストを保護しています。check
から(間接的に)アクセスすると、プログラムがデッドロック状態になります。これは、computations
のリストから何かを解約したい場合に当てはまります。ダカフ、その考えられた答えに感謝します。私はweb2pyとフラスコを追求しながら、私のcherrypyの調査を保留にしました。しかし、あなたが提案したメカニズムは興味深いです... –
多くのおかげで、fumanchu。印刷ジョブの実行中に定期的に更新されるDBエントリの値を調べることによって、Monitorを使用して印刷ジョブを監視し、印刷ジョブスレッドをシャットダウンすることをMonitorにするほうがよいでしょう。 –