長時間実行されるプロセスを起動する必要があるPythonWebアプリケーションがあります。問題は、プロセスが終了するのを待ちたくないということです。起動して終了するだけです。
私はWindowsXPで実行しており、WebアプリはIISで実行されています(それが重要な場合)。
これまで私はpopenを試しましたが、うまくいかなかったようです。子プロセスが終了するまで待機しました。
長時間実行されるプロセスを起動する必要があるPythonWebアプリケーションがあります。問題は、プロセスが終了するのを待ちたくないということです。起動して終了するだけです。
私はWindowsXPで実行しており、WebアプリはIISで実行されています(それが重要な場合)。
これまで私はpopenを試しましたが、うまくいかなかったようです。子プロセスが終了するまで待機しました。
わかりました、私はついにこれを理解しました!これはうまくいくようです:
from subprocess import Popen
from win32process import DETACHED_PROCESS
pid = Popen(["C:\python24\python.exe", "long_run.py"],creationflags=DETACHED_PROCESS,shell=True).pid
print pid
print 'done'
#I can now close the console or anything I want and long_run.py continues!
注:shell=Trueを追加しました。それ以外の場合、子プロセスでprintを呼び出すと、「IOError:[Errno9]不正なファイル記述子」というエラーが発生しました。
DETACHED_PROCESS
基になるWINAPICreateProcess関数に渡されるプロセス作成フラグです。
Webアプリから直接プロセスを開始する代わりに、メッセージキューにジョブを書き込むことができます。別のサービスがメッセージキューから読み取り、ジョブを実行します。Pythonで記述された分散タスクキューであるCeleryをご覧ください。
これはほとんど機能します(ここから):
from subprocess import Popen
pid = Popen(["C:\python24\python.exe", "long_run.py"]).pid
print pid
print 'done'
「done」はすぐに印刷されます。問題は、上記のプロセスがlong_run.pyが戻るまで実行を続け、プロセスを閉じるとlong_run.pyのプロセスが強制終了されることです。
確かに、プロセスを親プロセスから完全に独立させる方法がいくつかあります。
subprocess.Popenはそれを行います。