关闭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
相关产品推荐
相关产品推荐

