誰かが特定のビューを訪れたときに、サブプロセスで長期実行バックグラウンドプロセスを開始する必要があります。ゾンビプロセスを作成せずにフラスコのバックグラウンドプロセスを停止する
私のコード:
from flask import Flask
import subprocess
app = Flask(__name__)
@app.route("/")
def index():
subprocess.Popen(["sleep", "10"])
return "hi\n"
if __name__ == "__main__":
app.run(debug=True)
これは、ほとんどの部分は、素晴らしい作品。
問題は、プロセス(スリープ)が終了すると、ps -Af | grep sleep
は[sleep] <defunct>
と表示されます。
私が読んだところでは、これはまだプロセスの参照がflask
にあるためです。
プロセスの終了後にこの参照を削除する方法はありますか?
私はので、私はそれにdel
を使用することができますが、これはサブプロセスが終了するまで応答を返すからフラスコを防ぐg.subprocess = subprocess.Popen(["sleep", "10"])
をやって、そしてプロセスは@app.after_request(response)
で終了するのを待ってみました - 私はそれがサブプロセスが終了する前に応答を返す必要があります。
注:
私はノンブロッキングであることをsubprocess.Popen操作を必要とする - これは重要です。
' Thread'クラスを呼び出してそこにコードを実装してください。そして、それを閉じるには、 'join'を使用してください[https://docs.python.org/2/library/threading.html#threading.Thread.join](https:// docs.python.org/2/library/threading.html#threading.Thread.join) – Valijon
Celery(http://www.celeryproject.org/)などの堅牢な方法を使用するようにプロジェクトを修正してください。代わりにバックグラウンド処理を行います。 – jsbueno