0

我有一个应用程序,其中包含一个 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 进程。

从玩弄代码来看,调用“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 或我结束进程的方式的问题。

4

1 回答 1

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()

这将导致它在您调用终止时正确退出(或者直接设置变量)

于 2014-10-17T20:29:58.027 回答