2015-11-25 5 views
9

Sto costruendo un'app per flac e ho bisogno di alcuni processi in background da eseguire. Ho deciso di andare con multiprocesso, ma sta producendo due processi durante l'esecuzione all'interno di Flask. Qualcuno sa perché questo sarebbe successo? L'ho provato su OS X e Ubuntu 12.04, con gli stessi risultati. Ecco un esempio:Multiprocesso nell'app mobile che fa girare 2 processi

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

volevo per rendere un processo asincrono con l'esecuzione di Process come un demone usando python 2.7.x. Il problema è che il ritorno nell'endpoint non si verifica fino al termine dell'esecuzione del processo, anche se daemon è impostato su True. Sto eseguendo questo su uWSGI, forse è per questo. – radtek

risposta

9

Questo è un problema con la funzione di auto-ricarica Flask, che viene utilizzato durante lo sviluppo per riavviare automaticamente il server web quando viene rilevato cambiamenti nel codice, al fine di servire il nuovo codice senza richiede un riavvio manuale.

Nella guida, la chiamata “app.run()” si trova sempre all'interno di una condizione “if __name__ == ‘__main__’”, poiché il reloader è impostato su on per impostazione predefinita. Quando si utilizza multiprocessing, questa condizione si tradurrà in falso, quindi bisogna disattivare invece l'autoreload Flask quando viene utilizzato in una funzione in questo modo:

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

link di riferimento:

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

+0

Fantastico, funziona. Grazie, stavo sbattendo la testa contro un muro con quello –

+0

Attenzione però, che la distribuzione di un'app Flask usando apache/mod_wsgi, usando multiprocessing non funziona affatto o è molto inaffidabile. Meglio usare una coda di attività come Celery, Huey o Rq. – jjmurre

+0

@ jjmurre: quale problema stai affrontando per Apache? Sto pianificando di distribuire la mia applicazione di flask con multiprocessing su apache. – gB08