关闭Python后孤立的子进程,尽管进行了清理

关闭Python后孤立的子进程,尽管进行了清理,python,wxpython,wxwidgets,chromium-embedded,cefpython,Python,Wxpython,Wxwidgets,Chromium Embedded,Cefpython,我的cefpython程序在任务管理器中生成孤立的subprocess.exe(我在Windows 10上)。(它们无限期地继续,并使用大量CPU。) 但是,它们仅在我在命令提示符下使用Ctrl-C结束程序时出现,通常在我退出GUI窗口(例如从任务栏)时不会出现 我知道在使用Python时,要在程序结束时进行清理,需要 打电话 删除对cef浏览器的所有引用 将cefpython与wxPython一起使用时,请删除对wx应用程序的引用 (这些都在cefpython的wxPython示例中演示。)

我的cefpython程序在任务管理器中生成孤立的
subprocess.exe
(我在Windows 10上)。(它们无限期地继续,并使用大量CPU。)

但是,它们仅在我在命令提示符下使用Ctrl-C结束程序时出现,通常在我退出GUI窗口(例如从任务栏)时不会出现

我知道在使用Python时,要在程序结束时进行清理,需要

  • 打电话
  • 删除对cef浏览器的所有引用
  • 将cefpython与wxPython一起使用时,请删除对wx应用程序的引用
  • (这些都在cefpython的wxPython示例中演示。)

    我已经在我的程序中完成了这些事情,如下所示:

    def启动(自):
    信号(SIGINT,lambda sig,帧:self.stop())
    sys.excepthook=cefpython.excepthook
    初始化({“多线程消息循环”:True})
    self.app=MyApp(clearSigInt=False)
    self.app.MainLoop()
    self.stop()
    def停止(自):
    self.app.removeBrowserReferences()#在我的自定义wx.app类上调用'self.browser=None'
    del self.app
    打印(“应用程序已删除”)
    cefpython.Shutdown()#我认为这样可以终止程序,因为下一行永远不会打印。
    打印(“称为关机”)
    
    请注意,
    .stop()
    中的清理步骤在两种情况下都会发生,可以从MainLoop完成并调用后续的
    .stop()
    ,也可以从Ctrl-C触发SIGINT处理程序,即
    .stop()

    在cefpython和wxPython之后,还有什么需要清理的地方吗?

    或者,是否有办法识别这些孤立进程,以便在程序开始时可以杀死它们?(这样至少不会超过1。)

    编辑:
    正如@Igor所问的,您可以在cefpython的repo中未经修改的示例中复制它!这有点罕见;我必须运行它,Ctrl-C,run-it,Ctrl-C,等等。但最终我得到了一个孤立的subprocess.exe,它无限期地使用>20%的CPU。(请注意,我的系统并没有受到特别的压力或任何东西。在重现问题之前,它的CPU占用率为1-5%。)


    这里有一个问题:

    你能在(未修改的)wxPython演示中重现它吗?这个例子运行正常,所以我的一些东西是一个问题。我将慢慢地将这个示例转换为我的版本,看看它在哪里中断。可能与线程有关,因为我确实有多个线程(虽然cef/wx代码应该只发生在主线程上,所以这仍然令人惊讶。)我不知道cef,但wx肯定应该在主线程上运行。你使用wxThreadEvent吗?我没有,没有。另外,我的和示例之间的一个很大区别是它们的cef。Initialize不使用多线程消息循环,因此它们的CreateBrowserSync不需要在像我这样的PostTask中调用。他们还在wx应用程序中使用MessageLoopWork和wx.Timer。我将我的工作转移到这些事情上,我希望它会起作用。让我们知道结果。如果能重现这一问题,那将是一件有趣的事情。