2012-04-22 11 views
4

私は、実行に10分以上かかるレポートを要求するWebアプリケーションを持っています。パフォーマンスを向上させることは別として、スレッドを設定してレポートを実行してユーザーにメールを送信し、その決定メッセージを直ちにユーザーに返します。cherrypyのMonitorを使って1つのタスクを実行して停止する方法はありますか?

(周波数パラメータをどうするか?)私はcherrypy.process.plugins.Monitorを見てきたが、それは正しい選択である場合、私は明確ではないよ

答えて

3

モニターが正しい選択ではありません。同じタスクを繰り返し実行するためのものです。おそらくちょうどthreading.Thread(target=run_report).start()に電話する方が良いでしょう。 202 Acceptedをユーザーに返信し、クライアントがステータスを監視したり、新しく作成されたレポートリソースを取得できるようにするためのURLを用意します。

これは、cherrypy.engineが停止したときに新しいスレッドを正常にシャットダウンしたい場合があることです。バス上の「停止」チャンネルに接続する方法の例については、さまざまなプラグインを見てください。もう1つのオプションは、スレッドが異常終了するかどうか気にしない場合、スレッドをデーモンにすることです。

+0

多くのおかげで、fumanchu。印刷ジョブの実行中に定期的に更新されるDBエントリの値を調べることによって、Monitorを使用して印刷ジョブを監視し、印刷ジョブスレッドをシャットダウンすることをMonitorにするほうがよいでしょう。 –

0

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のリストから何かを解約したい場合に当てはまります。
+0

ダカフ、その考えられた答えに感謝します。私はweb2pyとフラスコを追求しながら、私のcherrypyの調査を保留にしました。しかし、あなたが提案したメカニズムは興味深いです... –

関連する問題