烧瓶应用程序中的多进程旋转2个进程

g_g*_*llz 10 python multiprocessing flask python-multiprocessing

我正在构建一个烧瓶应用程序,需要一些后台进程来运行.我决定使用multiprocess,但是在Flask中运行时它会产生两个进程.有谁知道为什么会这样?我在OS X和Ubuntu 12.04上测试了它,结果相同.这是一个例子:

import time
import multiprocessing
from flask import Flask

app = Flask(__name__)
backProc = None

def testFun():
    print('Starting')
    while True:
        time.sleep(3)
        print('looping')
        time.sleep(3)
        print('3 Seconds Later')

@app.route('/')
def root():

    return 'Started a background process with PID ' + str(backProc.pid) + " is running: " + str(backProc.is_alive())

@app.route('/kill')
def kill():
    backProc.terminate()
    return 'killed: ' + str(backProc.pid)

@app.route('/kill_all')
def kill_all():
    proc = multiprocessing.active_children()
    for p in proc:
        p.terminate()
    return 'killed all'

@app.route('/active')
def active():
    proc = multiprocessing.active_children()
    arr = []
    for p in proc:
        print(p.pid)
        arr.append(p.pid)

    return str(arr)

@app.route('/start')
def start():
    global backProc
    backProc = multiprocessing.Process(target=testFun, args=(), daemon=True)
    backProc.start()
    return 'started: ' + str(backProc.pid)

if __name__ == '__main__':
    app.run(port=int("7879"))
Run Code Online (Sandbox Code Playgroud)

sta*_*ind 11

这是Flask自动重新加载功能的问题,该功能在开发期间用于在检测到代码更改时自动重新启动Web服务器,以便在不需要手动重新启动的情况下提供新代码.

在指南中,“app.run()”调用始终位于“if __name__ == ‘__main__’”条件中,因为默认情况下重新加载器设置为on.使用多处理时,这种情况会导致false,所以你必须在这样的函数中使用它时禁用Flask自动重载:

def startWebserver():
          app.run(debug=True, use_reloader=False)
Run Code Online (Sandbox Code Playgroud)

链接供参考:

http://blog.davidvassallo.me/2013/10/23/nugget-post-python-flask-framework-and-multiprocessing/