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