3

ユーザーがかなり長時間実行されるプロセス (5 ~ 30 秒) を起動できるようにするアプリケーションを作成しようとしています。次に、プロセスが生成されたときに、ユーザーがプロセスの出力を確認できるようにする必要があります。出力はユーザーの現在のセッションでのみ必要になるため、長期間保存する必要はありません。Pylons フレームワークを利用しながらこれを達成する方法について、2 つの質問があります。

  1. Pylons コントローラでこのようなバックグラウンド プロセスを起動する最良の方法は何ですか?

  2. バックグラウンド プロセスの出力をユーザーに返す最善の方法は何ですか? (出力をデータベースやセッション データなどに保存する必要がありますか?)

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

4

2 に答える 2

6

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

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

優れた Python デーモンのレシピ: http://code.activestate.com/recipes/278731/

于 2009-07-27T18:25:18.680 に答える
1

これはパイロンとはほとんど関係がないと思います。次の手順で(どのようなフレームワークでも)それを行います。

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

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

于 2009-07-25T17:46:42.930 に答える