3

作業中のツールがあり、パーサーを実行し、別の分析ログを出力するために必要です。現在、私はそれを持っているので、それはウェブインターフェースを通してです。

  1. ユーザーはフォームに移動し、解析用のファイル名を送信します(ファイルはすでにシステム上にあります)。
  2. フォームはPythonCGIスクリプトに情報を送信します
  3. Python CGIスクリプトが実行され、サブプロセスが生成されて解析が実行されます。
  4. パーサーは分析に適切な情報を見つけ、サブプロセスも生成します。

使ってます

import subprocess
...
subprocess.Popen(["./program.py", input])

私のコードでは、ドキュメントから、子プロセスが終了するのを待たずに、スクリプトを実行し続けると仮定しました。これをすべて開始する私のCGIスクリプトは次のことを行います。

subprocess.Popen(["./program.py", input])
// HTML generation code
// Javascript to refresh after 1 second to a different page

HTML生成コードは、リクエストを処理したステータスだけを出力し、JavaScriptがページをメインホームページに更新します。

問題

CGIページは、サブプロセスが終了するまでハングしますが、これは私が望んでいることではありません。Popenはサブプロセスが終了するのを待たないと思っていましたが、このツールを実行すると、完了するまで停止します。スクリプトを終了してサブプロセスをバックグラウンドで実行し、ユーザーがすべてが読み込み信号で停止していると思わずにWebページが適切に機能するようにします。

読んだところどこでも待たないと言っているので、ポペンがこれをする理由を見つけることができないようですが、そう思われます。

また、奇妙なことに、スクリプトが完了する前に、apacheログに「Requestbodyreadtimeout」と表示されます。それでは、Apacheは実際にスクリプトを停止していますか?

申し訳ありませんが、完全なコードは「機密」であるため表示できませんが、ロジックが理解されていることを願っています。

4

2 に答える 2

1

なぜこれが機能するのか正確にはわかりませんが、私はこのスレッドの答えに従いました: 終了するのを待たずにPythonで別のスクリプトを実行するにはどうすればよいですか?

行うには:

p = subprocess.Popen([sys.executable, '/path/to/script.py'], 
                     stdout=subprocess.PIPE, 
                     stderr=subprocess.STDOUT)

それ以外の:

p = subprocess.Popen([sys.executable, '/path/to/script.py'])

そして、何らかの理由で、CGIスクリプトが終了し、サブプロセスが実行され続けます。なぜ違いがあるのか​​についての洞察は役に立ちますか?他の2つのパラメーターを定義しなければならないことが、なぜそのようなストールを引き起こすのかわかりません。

于 2012-07-03T19:40:07.153 に答える
1

Apache はおそらく、子プロセスが完了するのを待ちます。子 (ダブル フォーク、setsid) を悪魔化するか、ローカル サービスにジョブを送信することをお勧めします。

于 2012-07-03T19:27:30.013 に答える