2009-07-25 10 views
3

私は、ユーザーがかなり長時間のプロセス(5〜30秒)を開始できるようにするアプリケーションを作成しようとしています。プロセスは、生成されたプロセスの出力を確認することができます。出力はユーザーの現在のセッションにのみ必要なので、何も長期間保存する必要はありません。Pylonsでバックグラウンドプロセスを起動するにはどうしたらいいですか?

  1. Pylonsのコントローラでこのようなバックグラウンド・プロセスを起動するための最良の方法は何ですか:私はPylonsのフレームワークを活用しながら、これを実現する方法に関する2つの質問がありますか?

  2. バックグラウンドプロセスの出力をユーザーに戻す最良の方法は何ですか? (?I等、セッションデータに、データベース内の出力を格納する必要があります)

編集: 問題は、私はコントローラにsubprocessを使用してコマンドを起動した場合、コントローラは、サブプロセスを待ちます処理が完了するまで、読み込み中の空白のページをユーザーに表示して、続行する前に終了します。私は、サブプロセスを開始した直後にユーザーをステータスページにリダイレクトして、それを単独で完了できるようにしたいと考えています。

答えて

6

私は以前にこの問題を処理しました。(HTTP経由で長時間実行されるプロセス)呼び出された2番目のプロセスをデーモン化することによって、この問題を処理しました。あなたのPylonsコントローラは、2番目のプロセス(必要なデータを渡す)へのシステムコールを行い、2番目のプロセスはすぐにデーモンになります。これでシステムコールが終了し、コントローラが復帰することができます。

私のWebアプリケーションは通常、デーモンプロセスが完了するまで「チェックオン」するAJAXリクエストを発行します。私はデーモンとweb-appの間で情報を共有するために、tmpファイル(cPickleはうまく動作する)とデータベースの両方を使用しました。

優秀なのpythonデーモンレシピ:http://code.activestate.com/recipes/278731/

+0

私はこの問題にぶつかっています。それは安全ですか? 1分ごとに10000人のユーザーがいる場合はどうなりますか?そして、ほとんどのリクエストは非常に高価ですか?それから多くのデーモンが動いていますか?また、デーモンパイロンプロセスの実行を提案していますか? ThAnks。 – User007

+0

これは安全ですか?はい、私はこれを数年間、実稼働環境で使用してきました。デーモンが正常に終了するプロセスを確認してください。しかし、私の負荷はおそらく*時間*当たり数十人のユーザーに過ぎません。 1時間あたり10,000人のユーザーで、長時間実行されるプロセスを安全に起動する方法はありますか?あなたのサーバでも、そのような種類のメモリ/ CPU使用量を処理できますか? 2番目のプロセスをフォークアウトしなかった場合は、Webサーバーの設定でも処理できますか? – Mark

1

これはパイロンとはほとんど関係がないと思います。私はこれらのステップで

    を生成し、データベースにレコードを追加します。
  • 新しいプロセスを作成します。サブプロセスモジュールを使用して、コマンドライン(*)にIDを渡します。
  • プロセスは、パイロンに/tmp/project/ID
  • にその出力を書き込む形/job/ID又は/job?id=IDのURLを実装有します。これは、ジョブが完了したかどうかをデータベースに調べ、一時出力をページにマージします。

(*)サブプロセスがすぐに別のプロセスを作成し、パイロンプロセスが最初の子を待ってゾンビプロセスがないようにする方がよい場合があります。

+0

予測可能な一時ファイル名は、多くの場合、安全ではない - 彼らはあなたのウェブサーバが書き込みアクセス権を持っているに任意のファイルを上書きするために悪用されることができます。私は/ varの下にあらかじめ作成された(適切なパーミッションで)ディレクトリを使用することを提案します。 –

関連する問題