GUI关闭时同步终止multiprocessing多进程的实现问题咨询
问题根源
multiprocessing创建的子进程拥有独立内存空间,你在p2子进程中修改的self.ex属于子进程内部的实例属性,不会同步到主进程的Persona实例上,主进程读取的永远是初始化时的True,自然触发不了终止逻辑- 你当前的检测逻辑只执行了一次,没有循环持续检测,就算状态能同步也只能在程序启动瞬间判断一次,后续状态变化不会触发操作
修复方案
可以用multiprocessing提供的Event共享状态对象实现跨进程状态同步,再加上循环检测逻辑即可,修改后代码如下:
1. main.py 代码调整
class Persona(): # 接收主进程传入的共享Event对象 def __init__(self, stop_event): self.stop_event = stop_event def gui(): # GUI关闭时修改共享Event的状态 self.stop_event.set() gui()
2. driver.py 代码调整
import multiprocessing as mp from main import Persona, player def main(): # 初始化共享状态Event,默认未触发 stop_event = mp.Event() p1 = mp.Process(target=player) # 将共享Event作为参数传给p2的Persona实例 p2 = mp.Process(target=Persona, args=(stop_event,)) p1.start() p2.start() # 循环检测状态,1秒检测一次可自行调整间隔 while p2.is_alive(): if stop_event.is_set(): p1.terminate() p2.terminate() # 等待进程完全退出释放资源 p1.join() p2.join() break # 避免空转占满CPU mp.sleep(1) if __name__ == '__main__': main()
可选优化方案
如果你的GUI框架支持窗口关闭事件回调,可以直接在回调中终止子进程,不需要轮询:
- 比如tkinter可以绑定
protocol("WM_DELETE_WINDOW", 回调函数),直接在回调里调用子进程的terminate方法即可,实现更优雅,也不会额外占用轮询资源
内容的提问来源于stack exchange,提问作者990
相关产品推荐
相关产品推荐

