HTML 触发守护进程子进程的调用
HTML call that triggers daemon subprocess
我正在尝试定义一个程序来接收 HTML 请求以在我的服务器中触发一个进程并将它 运行 留在那里,作为守护进程,直到另一个 HTML 调用告诉服务器杀死它。我的问题是在正确的 HTML 响应后离开守护程序 运行。
我正在使用基于 Flask 的 python 网络服务器。我已经尝试了 python 的多处理和子进程模块但没有成功,通常主进程会在它可以做任何事情之前完成并杀死子进程。
在我最新的迭代中,我尝试将两者结合起来,使用多处理线程作为守护进程来启动子进程,但在这种情况下,服务器从未 returns 响应 - 尽管线程是守护进程,但它是等待子进程完成(它永远不会)并阻止主程序返回...
我没有想法...请帮忙?
这是代码:
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)
我正在回答我自己的问题以关闭它以防有人偶然发现这个问题。我不确定这对其他人有多适用,因为我所有的问题都可能是由于我的服务器设置 (nginx -> uwsgi -> Flask -> python 2.7)
我尝试了评论中提到的@J.F.Sebastian; concurrent.futures
(python 2.7 的反向移植版本)没有完成这项工作(进程等待循环完成并且从未返回对 HTTP 请求的响应)。 celery
我没有测试,因为它似乎太过分了。
我也尝试了我发现的 daemons
模块,但除了需要对我的代码进行大量返工之外,它(出于某种原因我无法弄清楚)杀死了父 uwsgi 进程。
最后,我尝试了 subprocess.Popen
中的 close_fds=True
参数,就像@J.F.Sebastian 所建议的那样,它有效,但是当我终止进程时,它变成了僵尸。我还尝试了 &
参数告诉 Linux 在后台工作,它没有太大变化,只是进程的终止更干净一些。
如果有人感兴趣,希望这对您有所帮助。
我正在尝试定义一个程序来接收 HTML 请求以在我的服务器中触发一个进程并将它 运行 留在那里,作为守护进程,直到另一个 HTML 调用告诉服务器杀死它。我的问题是在正确的 HTML 响应后离开守护程序 运行。
我正在使用基于 Flask 的 python 网络服务器。我已经尝试了 python 的多处理和子进程模块但没有成功,通常主进程会在它可以做任何事情之前完成并杀死子进程。
在我最新的迭代中,我尝试将两者结合起来,使用多处理线程作为守护进程来启动子进程,但在这种情况下,服务器从未 returns 响应 - 尽管线程是守护进程,但它是等待子进程完成(它永远不会)并阻止主程序返回...
我没有想法...请帮忙?
这是代码:
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)
我正在回答我自己的问题以关闭它以防有人偶然发现这个问题。我不确定这对其他人有多适用,因为我所有的问题都可能是由于我的服务器设置 (nginx -> uwsgi -> Flask -> python 2.7)
我尝试了评论中提到的@J.F.Sebastian; concurrent.futures
(python 2.7 的反向移植版本)没有完成这项工作(进程等待循环完成并且从未返回对 HTTP 请求的响应)。 celery
我没有测试,因为它似乎太过分了。
我也尝试了我发现的 daemons
模块,但除了需要对我的代码进行大量返工之外,它(出于某种原因我无法弄清楚)杀死了父 uwsgi 进程。
最后,我尝试了 subprocess.Popen
中的 close_fds=True
参数,就像@J.F.Sebastian 所建议的那样,它有效,但是当我终止进程时,它变成了僵尸。我还尝试了 &
参数告诉 Linux 在后台工作,它没有太大变化,只是进程的终止更干净一些。
如果有人感兴趣,希望这对您有所帮助。