触发守护进程子进程

时间:2015-06-09 10:06:08

标签: python flask subprocess daemon

我正在尝试定义一个程序来接收一个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)

1 个答案:

答案 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在后台工作,它没有太大变化,只是杀死了这个过程有点清洁。

希望这有帮助,如果有人有兴趣的话。