我想要定義一個程序來接收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)
[「守護進程」意味着一個相當具體的東西](https://pypi.python.org/pypi/python-daemon/)。你確定要啓動一個守護進程嗎(爲什麼不用一個簡單的後臺進程(或許'close_fds = True'就足夠了))?爲什麼你使用子進程來運行Python代碼?你嘗試過'concurrent.futures','芹菜'嗎? – jfs
@ J.F.Sebastian我需要一個守護進程,以便進程在HTML請求完成後繼續運行,否則一旦返回HTML調用就終止線程。我不知道如何關閉文件描述符會有幫助?我現在要研究concurrent.futures和芹菜,謝謝! – Alex
非守護進程也可以在http請求中生存。打開文件描述符可以保持網絡連接活着。 – jfs