我有一个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!
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'
“done”会立即被打印出来。问题在于上述过程会一直运行,直到long_run.py返回,如果我关闭该进程,它将杀死long_run.py的进程。
肯定有一些方法可以使进程完全独立于父进程。
'subprocess.Popen这个方法可以做到。