2010-06-03 93 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