6

長時間実行されるプロセスを起動する必要があるPythonWebアプリケーションがあります。問題は、プロセスが終了するのを待ちたくないということです。起動して終了するだけです。

私はWindowsXPで実行しており、WebアプリはIISで実行されています(それが重要な場合)。

これまで私はpopenを試しましたが、うまくいかなかったようです。子プロセスが終了するまで待機しました。

4

4 に答える 4

7

わかりました、私はついにこれを理解しました!これはうまくいくようです:

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関数に渡されるプロセス作成フラグです。

于 2010-06-04T12:41:24.323 に答える
2

Webアプリから直接プロセスを開始する代わりに、メッセージキューにジョブを書き込むことができます。別のサービスがメッセージキューから読み取り、ジョブを実行します。Pythonで記述された分散タスクキューであるCeleryをご覧ください。

于 2010-06-04T09:24:37.240 に答える
1

これはほとんど機能します(ここから):

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のプロセスが強制終了されることです。

確かに、プロセスを親プロセスから完全に独立させる方法がいくつかあります。

于 2010-06-04T12:04:23.607 に答える
0

subprocess.Popenはそれを行います。

于 2010-06-03T22:00:23.323 に答える