2015-11-25 69 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