关闭wxPython窗口时Python看门狗未终止

关闭wxPython窗口时Python看门狗未终止,python,windows,python-multiprocessing,python-watchdog,Python,Windows,Python Multiprocessing,Python Watchdog,我有一个应用程序,它包含一个wxpythongui,在初始化时启动一个看门狗观察器和一个python进程 class MonitorApp(wx.App): def __init__(self): wx.App.__init__(self, True, 'monitor_stderr.log', False, False) self.q = Queue() self.m = Queue() self.e = Queue()

我有一个应用程序,它包含一个wxpythongui,在初始化时启动一个看门狗观察器和一个python进程

class MonitorApp(wx.App):
    def __init__(self):
        wx.App.__init__(self, True, 'monitor_stderr.log', False, False)

        self.q = Queue()
        self.m = Queue()
        self.e = Queue()

        monitor_handler = DirectoryMonitorHandler(self.q)
        self.folder_monitor = polling.PollingObserver()
        self.folder_monitor.schedule(monitor_handler, source, recursive = True)
        self.folder_monitor.start()

        self.backlog_manager = BacklogManager(self.q, self.m, self.e)
        self.backlog_manager.start()
我正在通过以下wx.TaskBarIcon回调方法关闭wxPython窗口:

def onClickExit(self, event):
    app.keepGoing = False
    app.DestroyChildProcess()
    self.RemoveIcon()
    self.Destroy()
    self.frame.Destroy()
其中,流程为:

def DestroyChildProcess(self):
    self.folder_monitor.stop()
    self.folder_monitor.join()
    self.backlog_manager.terminate()
请注意,BacklogManager是一个多处理流程子类。我遇到的问题是,当我关闭wxpythongui窗口时,我仍然在Windows任务管理器中看到两个pythonw.exe进程。有三种可能性:

我没有正确终止GUI进程。不确定这是否是一个过程 我没有正确终止看门狗观察员。 我没有正确终止积压工作管理器流程。 从代码的使用情况来看,调用self.backlog_manager.terminate似乎工作正常,只剩下一个pythonw.exe实例在运行

有没有办法正确终止或停止所有pythonw.exe进程?我做错了什么

编辑-进一步调查后,这似乎是我用来启动python脚本的.bat脚本的一个问题。我实际上是在使用pythonw.exe和START/B隐藏命令行窗口

cd %~dp0
START /B .\Modules\statusWindow.pyw
当我以以下内容开始脚本时:

cd %~dp0
.\Modules\statusWindow.py

当我关闭命令行窗口时,所有windows任务管理器进程都将结束。我怀疑这可能是pythonw.exe的问题,也可能是我结束进程的方式的问题。

在windows上,我知道terminate最多只能不可靠地工作,我会这样做

class BacklogManager(multiprocessing.Process):
     _should_exit = multiprocessing.Value("b",0)
     def terminate(self):
         self._should_exit.value = 1
     def run(self):
        #instead of while True
        while not self._should_exit.value:
             do_work()
这将使它在调用terminate或直接设置变量时正确退出