2014-10-17 51 views
0

我有一個應用程序,它包含一個wxPython GUI,它在初始化時啓動監視器觀察者和python進程。關閉wxPython窗口時,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是一個多處理過程的子類。我遇到的問題是,當我關閉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的問題或者我結束這個過程的方式。

回答

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

這將導致它正確地退出,當你調用終止(或可選擇地直接設置變量)