2015-11-25 64 views
9

我正在构建烧瓶应用程序,并且需要一些后台进程才能运行。我决定使用多进程,但在Flask中运行时会产生两个进程。有谁知道为什么会发生?我已经在OS X和Ubuntu 12.04上测试过它,结果相同。这里有一个例子:烧瓶应用程序中的多进程启动2个进程

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")) 
+0

我想使用python 2.7.x作为守护进程运行Process来进行异步处理。问题是,即使守护进程设置为True,在进程完成运行之前,端点中的返回也不会发生。我在uWSGI上运行这个,也许这就是为什么。 – radtek

回答

9

这与瓶自动重载功能,这是开发过程中使用自动重新启动Web服务器检测到的代码更改时出了问题,为了满足了新的代码而不需要手动重启。

在本指南中,“app.run()”调用始终位于“if __name__ == ‘__main__’”条件内,因为默认情况下,重新加载器设置为打开。当使用多,这种情况会导致假的,所以你必须在函数中调用它的时候,像这样,而不是禁用瓶自动重:

def startWebserver(): 
      app.run(debug=True, use_reloader=False) 

参考链接:

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

+0

太棒了,工作。谢谢,我的头靠在一堵墙上 –

+0

但请注意,使用apache/mod_wsgi部署Flask应用程序,使用多处理功能根本不起作用或者非常不可靠。更好地使用像Celery,Huey或Rq这样的任务队列。 – jjmurre

+0

@ jjmurre:你面对Apache有什么问题?我打算在apache上部署我的烧瓶应用程序和多处理器。 – gB08