我的 cefpython 程序在任务管理器中导致孤立subprocess.exe
(我在 Windows 10 上)。(它们无限期地继续并使用大量 CPU。)
但它们仅在我在命令提示符中使用 Ctrl-C 结束程序时出现,而不是在我正常退出 GUI 窗口(例如从任务栏)时出现。
我知道在使用 cefpython 时,要在程序结束时进行清理,您需要
- 调用cef.Shutdown()。
- 删除所有对 cef 浏览器的引用
- 将 cefpython 与 wxPython 一起使用时,删除对 wx App 的引用
(这些都在 cefpython 的 wxPython 示例中演示。)
我在我的程序中做了这些事情,如下图:
def start(self):
signal(SIGINT, lambda sig, frame: self.stop())
sys.excepthook = cefpython.ExceptHook
cefpython.Initialize({"multi_threaded_message_loop": True})
self.app = MyApp(clearSigInt=False)
self.app.MainLoop()
self.stop()
def stop(self):
self.app.removeBrowserReferences() # calls `self.browser = None` on my custom wx.App class
del self.app
print("App is deleted.")
cefpython.Shutdown() # I believe it is fine that this terminates the program, since the next line never prints.
print("Shutdown is called.")
请注意,清理步骤在.stop()
两种情况下都会发生,要么从 MainLoop 完成并调用后续的.stop()
,要么从 Ctrl-C 触发 SIGINT 处理程序,即.stop()
.
在 cefpython 和 wxPython 之后还有什么需要清理的吗?
或者,有没有办法识别这些孤立的进程,以便在程序开始时杀死它们?(那么至少它们不会超过 1。)
编辑:
正如@Igor 所问,事实证明你可以在cefpython 的repo 的未修改示例中重现它!这有点罕见;我必须运行它,Ctrl-C,运行它,Ctrl-C 等,但最终我确实得到了一个孤立的 subprocess.exe,它无限期地使用 >20% 的 CPU。(请注意,我的系统没有受到特别的压力或任何压力。在重现问题之前它的 CPU 为 1-5%。)