Python - 从网页应用启动长时间运行的进程

6 投票
4 回答
8963 浏览
提问于 2025-04-15 23:32

我有一个用Python写的网页应用程序,它需要启动一个运行时间很长的任务。不过,我不想让这个应用程序等着这个任务完成。只需要启动它,然后就可以继续做其他事情。

我是在Windows XP上运行这个应用程序,而且它是在IIS这个服务器上运行的(如果这有影响的话)。

到目前为止,我试过用popen这个方法,但好像不太管用。它还是等到那个子任务完成才继续。

4 个回答

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 的进程也给杀掉。

肯定有办法让一个进程完全独立于它的父进程。

2

与其直接从你的网页应用启动进程,不如把任务写入一个消息队列。然后,另一个独立的服务会从这个消息队列中读取任务并执行它们。你可以看看 Celery,这是一个用Python写的分布式任务队列。

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 函数。

撰写回答