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 在后台工作,它没有太大变化,只是进程的终止更干净一些。

如果有人感兴趣,希望这对您有所帮助。