我有一个需要启动长时间运行的进程的python web应用程序。问题是我不希望它等待整个过程结束。刚刚启动并完成。Python - 从Web应用程序启动长时间运行的进程
我在Windows XP上运行,并且Web应用程序在IIS下运行(如果有的话)。
到目前为止,我尝试了popen,但似乎没有工作。它一直等到子进程结束。
我有一个需要启动长时间运行的进程的python web应用程序。问题是我不希望它等待整个过程结束。刚刚启动并完成。Python - 从Web应用程序启动长时间运行的进程
我在Windows XP上运行,并且Web应用程序在IIS下运行(如果有的话)。
到目前为止,我尝试了popen,但似乎没有工作。它一直等到子进程结束。
好吧,我终于明白了这一点!这似乎工作:
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。
关于如何在Unix上执行此操作的任何想法? – nbarraille 2011-07-15 12:49:12
这个标志在Unix上似乎不需要 – MarcH 2012-07-23 13:07:05
我不需要shell = True来使其工作。错误的文件描述符错误可能是不相关的。 – MarcH 2012-07-23 13:08:54
subprocess.Popen这样做。
您可以将作业写入消息队列,而不是直接从Web应用程序启动进程。一个单独的服务从消息队列中读取并运行作业。看看Celery,这是一个用Python编写的分布式任务队列。
这几乎工程(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的进程。
当然有一些方法可以使流程完全独立于父流程。
Windows特定方式:http://docs.python.org/library/os.html#os.startfile – 2010-06-04 12:41:20
而不是写“看起来没有工作”,请尝试写出究竟发生了什么。它是否引发异常?它做了什么比你所期望的不同吗? (如果是这样,它做了什么?)。这通常会让其他人更容易帮助你。 – 2010-06-03 22:04:17
以下是一些看起来很有前途的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