Python – 从Web应用程序启动一个长时间运行的进程

我有一个Python Web应用程序,需要启动一个长时间运行的过程。 问题是我不希望它等待整个过程完成。 刚刚启动并完成。

我在Windows XP上运行,Web应用程序在IIS下运行(如果有的话)。

到目前为止,我试图popen,但似乎没有工作。 它一直等到subprocess结束。

好吧,我终于明白了这一点! 这似乎工作:

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编写的分布式任务队列。

子进程.Popen这样做。

这几乎起作用( 从这里 ):

 from subprocess import Popen pid = Popen(["C:\python24\python.exe", "long_run.py"]).pid print pid print 'done' 

“完成”将立即打印。 问题是,上面的过程一直运行,直到long_run.py返回,如果我关闭了进程它杀死long_run.py的进程。

当然有一些方法可以使一个流程完全独立于父流程。