0

初期化時にウォッチドッグ オブザーバーと Python プロセスを起動する wxPython GUI を含むアプリがあります。

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 タスク マネージャーに 2 つの pythonw.exe プロセスが表示されることです。次の 3 つの可能性があります。

  1. GUI プロセスを正しく終了していません。(プロセスかどうかは不明)
  2. ウォッチドッグ オブザーバーを正しく終了していません。
  3. backlog_manager プロセスを正しく終了していません。

コードをいじってみると、「self.backlog_manager.terminate()」という呼び出しが正しく機能しているように見え、pythonw.exe の 1 つのインスタンスが実行されたままになっています。

すべての 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では、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()

これにより、終了を呼び出したときに適切に終了します(または変数を直接設定します)

于 2014-10-17T20:29:58.027 に答える