我有一個需要啓動長時間運行的進程的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