2010-06-03 95 views
4

我有一个需要启动长时间运行的进程的python web应用程序。问题是我不希望它等待整个过程结束。刚刚启动并完成。Python - 从Web应用程序启动长时间运行的进程

我在Windows XP上运行,并且Web应用程序在IIS下运行(如果有的话)。

到目前为止,我尝试了popen,但似乎没有工作。它一直等到子进程结束。

+1

而不是写“看起来没有工作”,请尝试写出究竟发生了什么。它是否引发异常?它做了什么比你所期望的不同吗? (如果是这样,它做了什么?)。这通常会让其他人更容易帮助你。 – 2010-06-03 22:04:17

+0

以下是一些看起来很有前途的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 2010-06-03 22:10:42

回答

6

好吧,我终于明白了这一点!这似乎工作:

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! 

注:我增加了壳=真。否则,调用子进程打印给我的错误“IO错误:[错误9]坏文件描述符”

DETACHED_PROCESS是传递到底层WINAPI CreateProcess功能Process Creation Flag

+1

关于如何在Unix上执行此操作的任何想法? – nbarraille 2011-07-15 12:49:12

+0

这个标志在Unix上似乎不需要 – MarcH 2012-07-23 13:07:05

+1

我不需要shell = True来使其工作。错误的文件描述符错误可能是不相关的。 – MarcH 2012-07-23 13:08:54

0

subprocess.Popen这样做。

+1

你知道我会怎么称呼它吗?当我尝试它时,它一直等到长时间运行的过程结束。也许我说错了。 – Greg 2010-06-03 22:12:15

+0

您不能等待应用程序输出或终止:) – Messa 2010-06-04 12:06:06

2

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

0

这几乎工程(from here):

from subprocess import Popen 

pid = Popen(["C:\python24\python.exe", "long_run.py"]).pid 
print pid 
print 'done' 

'完成' 会马上离开印刷。问题是,上面的过程一直运行,直到long_run.py返回,如果我关闭了进程,它会杀死long_run.py的进程。

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

+1

Windows特定方式:http://docs.python.org/library/os.html#os.startfile – 2010-06-04 12:41:20