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

6

我有一个Python Web应用程序,需要启动一个长时间运行的进程。但是我不想它等待进程完成。只需启动并完成。

我在Windows XP上运行,并且Web应用程序在IIS下运行(如果这很重要)。

到目前为止,我尝试使用popen,但似乎无法工作。它会等待子进程完成。


2
不要写“似乎没有起作用”,而是写出具体发生了什么。它是否引发了异常?它是否执行了与您预期不同的操作?(如果是这样,它做了什么?)这通常会使其他人更容易帮助您。 - Ofri Raviv
这里有几个看起来很有前途的Windows API命令,如果我们想不到其他的方法,我会试着用它们:http://timgolden.me.uk/pywin32-docs/win32api__ShellExecute_meth.html http://timgolden.me.uk/pywin32-docs/win32console__FreeConsole_meth.html http://timgolden.me.uk/pywin32-docs/win32process__CreateProcess_meth.html - Greg
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函数的进程创建标志

1
有没有关于如何在Unix上实现这个的想法? - nbarraille
在Unix上似乎不需要这个标志。 - MarcH
1
这个不需要设置 shell=True 就可以工作。坏的文件描述符错误可能与此无关。 - MarcH

2

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


1

这个几乎可以工作(从这里):

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的进程。

肯定有一些方法可以使进程完全独立于父进程。

'

0

1
你知道我该怎么称呼它吗?当我尝试调用它时,它一直等待长时间运行的进程完成。也许我调用方法不正确。 - Greg
你不需要等待应用程序的输出或终止 :) - Messa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接