我有一个需要启动长时间运行进程的python Web应用程序。问题是我不希望它等待整个过程。刚刚发射完成。
我在Windows XP上运行,并且网络应用程序在IIS下运行(如果这很重要)。
到目前为止,我尝试过popen,但这似乎不起作用。它一直等到子进程结束。
答案 0 :(得分: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:[Errno 9] Bad file descriptor”
DETACHED_PROCESS
是传递给基础WINAPI Process Creation Flag函数的CreateProcess。
答案 1 :(得分:2)
您可以将作业写入消息队列,而不是直接从Web应用程序启动进程。单独的服务从消息队列中读取并运行作业。看看Celery,一个用Python编写的分布式任务队列。
答案 2 :(得分:1)
这几乎有效(from here):
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的进程。
当然,有一些方法可以让一个过程完全独立于父过程。
答案 3 :(得分:0)
subprocess.Popen就是这么做的。