关闭Python后孤立的子进程,尽管进行了清理
我的cefpython程序在任务管理器中生成孤立的关闭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示例中演示。)
subprocess.exe
(我在Windows 10上)。(它们无限期地继续,并使用大量CPU。)
但是,它们仅在我在命令提示符下使用Ctrl-C结束程序时出现,通常在我退出GUI窗口(例如从任务栏)时不会出现
我知道在使用Python时,要在程序结束时进行清理,需要
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。我将我的工作转移到这些事情上,我希望它会起作用。让我们知道结果。如果能重现这一问题,那将是一件有趣的事情。