web-dev-qa-db-ja.com

flaskアプリが2つのプロセスをスピンアップする内のマルチプロセス

flaskアプリを構築していて、実行するにはいくつかのバックグラウンドプロセスが必要です。マルチプロセスを使用することにしましたが、Flask内で実行すると2つのプロセスが生成されます。なぜこれが発生するのか誰か知っていますか? OSXとUbuntu12.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"))
12
g_grillz

これは、Flask自動リロード機能の問題です。この機能は、開発中に、コードの変更が検出されたときにWebサーバーを自動的に再起動して、手動を必要とせずに新しいコードを提供するために使用されます。再起動。

このガイドでは、リローダーがデフォルトでオンに設定されているため、“app.run()”呼び出しは常に“if __name__ == ‘__main__’”条件内に配置されます。マルチプロセッシングを使用する場合、この条件はfalseになるため、次のような関数で使用する場合は、代わりにFlask autoreloadを無効にする必要があります。

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

参照用のリンク:

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

11
stacklikemind