关闭wxPython窗口时,Python看门狗不会终止

时间:2014-10-17 19:17:48

标签: python windows python-multiprocessing python-watchdog

我有一个应用程序,其中包含一个wxPython GUI,可以在初始化时启动监视程序观察器和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()

其中DestroyChildProcess是:

def DestroyChildProcess(self):
    self.folder_monitor.stop()
    self.folder_monitor.join()
    self.backlog_manager.terminate()

请注意,BacklogManager是一个多处理Process子类。我遇到的问题是当我关闭wxPython GUI窗口时,我仍然在Windows任务管理器中看到两个pythonw.exe进程。有三种可能性:

  1. 我没有正确终止GUI进程。 (不确定是否是一个过程)
  2. 我没有正确终止看门狗观察员。
  3. 我没有正确终止backlog_manager进程。
  4. 从播放代码开始,调用“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的问题或我结束这个过程的方式。

1 个答案:

答案 0 :(得分:0)

在Windows上我知道终止工作不可靠,我会做的就像

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时正确退出(或者直接设置变量)