在线程中正确终止 Flask Web 应用程序 运行

Properly terminate flask web app running in a thread

如何正确终止在单独线程中启动的 Flask Web 应用程序?我发现了一个不完整的 ,不清楚如何去做。下面的脚本启动一个线程,该线程又启动一个烧瓶应用程序。当我按下 CTRL+C 时,某些东西没有被终止并且脚本永远不会停止。最好在 except KeyboardInterrupt: 之后添加正确终止 appthread_webAPP() 的代码。我知道如何终止线程,但首先我需要终止应用程序:

def thread_webAPP():
    app = Flask(__name__)

    @app.route("/")
    def nothing():
        return "Hello World!"

    app.run(debug=True, use_reloader=False)
    # hope that after app.run() is terminated, it returns here, so this thread could exit


t_webApp = threading.Thread(name='Web App', target=thread_webAPP)
t_webApp.start()

try:
    while True:
        time.sleep(1)

except KeyboardInterrupt:
    print("exiting")
    # Here I need to kill the app.run() along with the thread_webAPP

不要 join 子线程。使用 setDaemon 代替:

from flask import Flask
import time
import threading


def thread_webAPP():
    app = Flask(__name__)

    @app.route("/")
    def nothing():
        return "Hello World!"

    app.run(debug=True, use_reloader=False)


t_webApp = threading.Thread(name='Web App', target=thread_webAPP)
t_webApp.setDaemon(True)
t_webApp.start()

try:
    while True:
        time.sleep(1)

except KeyboardInterrupt:
    print("exiting")
    exit(0)

daemon 对于子线程意味着如果您试图停止主线程,主线程将不会等到该守护进程子线程完成其工作。在这种情况下,所有子线程将自动加入,主线程将立即成功停止。

更多信息是 here