我有一个 python web 应用程序需要启动一个长时间运行的进程。问题是我不希望它等待该过程完成。只需启动并完成。
我在 Windows XP 上运行,并且 Web 应用程序在 IIS 下运行(如果重要的话)。
到目前为止,我尝试了 popen 但这似乎没有用。它一直等到子进程完成。
我有一个 python web 应用程序需要启动一个长时间运行的进程。问题是我不希望它等待该过程完成。只需启动并完成。
我在 Windows XP 上运行,并且 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:[Errno 9] Bad file descriptor”
DETACHED_PROCESS
是传递给底层 WINAPI CreateProcess函数的进程创建标志。
您可以将作业写入消息队列,而不是直接从您的 web 应用程序启动进程。一个单独的服务从消息队列中读取并运行作业。看看Celery,一个用 Python 编写的分布式任务队列。
这几乎有效(从这里开始):
from subprocess import Popen
pid = Popen(["C:\python24\python.exe", "long_run.py"]).pid
print pid
print 'done'
“完成”将立即打印。问题是上面的进程一直运行直到 long_run.py 返回,如果我关闭该进程,它会杀死 long_run.py 的进程。
当然,有一些方法可以使进程完全独立于父进程。
subprocess.Popen就是这样做的。