You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关闭Tkinter窗口时如何同步终止Flask应用?解决多进程异常

解决Flask与Tkinter多进程同步终止问题

问题分析

当前代码中主进程先等待Flask进程结束,再等待Tkinter进程,导致关闭Tkinter窗口时Flask仍会持续运行;若Flask先终止,Tkinter也会残留。EOFError多因进程资源未正确释放、主进程等待逻辑异常引发。

优化方案

通过监听Tkinter关闭事件+主动终止对应进程的方式实现同步终止,同时调整主进程的监控逻辑,确保任意一方退出时另一方能及时结束。

修改后的代码

### MAIN CODE FOR FLASK APP IS ABOVE ###
import tkinter as tk
from multiprocessing import Process

def flask_run():
    app.run(port=PORT, use_reloader=False)  # 关闭自动重载,避免多子进程无法终止

def tk_run(flask_process):
    root = tk.Tk()
    root.geometry("800x600")
    root.title("Telemate GUI")
    root.config(bg="#2c3e50")

    def on_closing():
        # 关闭窗口时终止Flask进程
        if flask_process.is_alive():
            flask_process.terminate()
            flask_process.join()
        root.destroy()

    # 绑定窗口关闭事件
    root.protocol("WM_DELETE_WINDOW", on_closing)
    root.mainloop()

if __name__ == "__main__":
    flask_process = Process(target=flask_run)
    flask_process.start()

    # 将Flask进程对象传入Tkinter进程,方便关闭时调用
    root_process = Process(target=tk_run, args=(flask_process,))
    root_process.start()

    # 主进程循环监控,任意进程退出则终止另一方
    while True:
        if not flask_process.is_alive():
            if root_process.is_alive():
                root_process.terminate()
                root_process.join()
            break
        if not root_process.is_alive():
            if flask_process.is_alive():
                flask_process.terminate()
                flask_process.join()
            break

关键改动说明

  • 关闭Flask自动重载:添加use_reloader=False,避免Flask启动时自动创建子进程,导致无法正确终止。
  • 绑定Tkinter关闭回调:通过protocol方法监听窗口关闭事件,主动终止Flask进程后销毁窗口。
  • 主进程监控逻辑:循环检查两个进程的存活状态,任意一方退出时立即终止另一方,确保同步结束。

额外注意事项

  • 若需实现滑块控制Flask变量等进程间数据交互,建议使用multiprocessing.Queue或Pipe,避免直接共享内存引发异常。
  • 终止进程后调用join(),确保资源正确释放,降低EOFError出现概率。

内容的提问来源于stack exchange,提问作者Rehan Samaratunga

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 20:52:12