Python - 从网页应用启动长时间运行的进程
我有一个用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 函数。