6

我有一个 python web 应用程序需要启动一个长时间运行的进程。问题是我不希望它等待该过程完成。只需启动并完成。

我在 Windows XP 上运行,并且 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:[Errno 9] Bad file descriptor”

DETACHED_PROCESS是传递给底层 WINAPI CreateProcess函数的进程创建标志

于 2010-06-04T12:41:24.323 回答
2

您可以将作业写入消息队列,而不是直接从您的 web 应用程序启动进程。一个单独的服务从消息队列中读取并运行作业。看看Celery,一个用 Python 编写的分布式任务队列。

于 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'

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

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

于 2010-06-04T12:04:23.607 回答
0

subprocess.Popen就是这样做的。

于 2010-06-03T22:00:23.323 回答