2015-06-09 41 views
1

我想要定義一個程序來接收HTML請求,以觸發我的服務器中的進程,並讓它作爲守護進程在那裏運行,直到另一個HTML調用告訴服務器終止它。我的問題是讓守護進程在正確的HTML響應之後運行。觸發守護進程子進程的HTML調用

我正在使用基於Flask的python web服務器。我已經嘗試過python的多進程和子進程模塊沒有成功,通常主進程會在它可以做任何事情之前完成並終止子進程。

在我最近的迭代中,我嘗試過使用multripocessing線程作爲守護進程來啓動子進程,但在這種情況下,服務器永遠不會返回響應 - 雖然線程已守護進程,但它正在等待子進程完成(它永遠不會),並保持主程序返回...

我出來的想法...請幫助嗎?

這是代碼:

from flask import Flask, request, abort 
app = Flask(__name__) 

import sys, time 

def f(): 
    import subprocess as sub 
    p = sub.Popen(['/path/to/file.py']) 
    print "process created " + str(p.pid) # prints to log 

@app.route("/", methods = ['POST', 'GET']) 
def home(): 
    if request.method == "GET": 
    # return an HTML form with a 'Login' button 
    return """ 
     <!DOCTYPE html> 
     <html> 
     <head> 
     </head> 
     <body> 
      Testing Login 
      <form action = "/" method = "post"> 
      <input type="submit" value="Login"> 
      </form> 
     </body> 
     </html> 
     """ 

    elif request.method == "POST": 
    import sys 
    import multiprocessing as mp 
    try: 
     m = mp.Process(name = 'sub', target = f) 
     m.daemon = True 
     m.start() 
     time.sleep(1) # artifically wait 1 sec for m to trigger subprocess 
     return "Logged in!" 
    except: 
     return "error! <br> " + str(sys.exc_info()) 
    else: 
    abort(401) 
+0

[「守護進程」意味着一個相當具體的東西](https://pypi.python.org/pypi/python-daemon/)。你確定要啓動一個守護進程嗎(爲什麼不用一個簡單的後臺進程(或許'close_fds = True'就足夠了))?爲什麼你使用子進程來運行Python代碼?你嘗試過'concurrent.futures','芹菜'嗎? – jfs

+0

@ J.F.Sebastian我需要一個守護進程,以便進程在HTML請求完成後繼續運行,否則一旦返回HTML調用就終止線程。我不知道如何關閉文件描述符會有幫助?我現在要研究concurrent.futures和芹菜,謝謝! – Alex

+0

非守護進程也可以在http請求中生存。打開文件描述符可以保持網絡連接活着。 – jfs

回答

0

我回答我的問題將其關閉的情況下,任何人都絆倒在此。我不知道這是如何適用於其他人,因爲我所有的問題可能是由於我的服務器設置(nginx - > uwsgi - > Flask - > python 2.7)

我試過@JFSebastian在評論中提到的; concurrent.futures(python 2.7的backported版本)沒有完成這項工作(該進程等待循環完成,並且永遠不會返回對HTTP請求的響應)。 celery我沒有測試,因爲它看起來太多了。

我也嘗試了我發現的daemons模塊,但除了需要對代碼進行大量的返工之外,它(由於某些原因我無法弄清楚)殺死了父uwsgi進程。

最後,我在subprocess.Popen中嘗試了close_fds=True的論點,就像@ J.F.Sebastian所建議的那樣,它有效,但是當我殺死這個過程時,它變成了殭屍。我也嘗試了&的說法,告訴Linux在後臺工作,它沒有太大的改變,只是對進程的查殺有點乾淨。

希望這有助於,如果任何人有興趣。