process - Electron 是否有杀死无用渲染器进程的标准方法?

标签 process electron chromium

我的应用程序创建了一个带有需要启用节点集成的本地页面的窗口。

单击此页面上的按钮后,我将导航到第三方页面。

因为我希望在此第三方页面中禁用节点,并且无法在 BrowserWindow 中切换节点集成,我将这个第三方页面加载到沙盒中 BrowserView它嵌入在窗口内部并被拉伸(stretch)以适应整个屏幕。

现在这样做会导航嵌入 View ,但 BrowserWindow卡在指向不再相关的旧本地页面。

为了防止这个额外的页面出现在后台,我浏览了我的 BrowserWindow"about:blank"有效地清除它并为 BrowserView 腾出空间.

我现在意识到,虽然这“清除”了旧页面,但它使与之关联的渲染器进程保持事件状态。来自 here :

Chromium creates a renderer process for each instance of a site the user visits



可以理解的是,导航到 "about:blank"不会向 Electron 发出它应该杀死另一个进程的信号。

我想摆脱这个渲染器进程,所以当我与窗口交互时,它不会不必要地坐在那里并使用 CPU 和内存。

有两件事起作用:

我删除了到 "about:blank" 的额外导航。因为我们现在正在终止进程并且:

1) 当我的渲染器中的按钮向主进程发送一条消息,告诉它创建一个 BrowserView并导航到新站点,我执行 process.exit(); .我想我的一部分对进程退出会干扰排队等待主要的消息感到紧张,尽管它似乎工作正常。

2) 我没有从渲染器中终止进程,而是创建并导航了我的 BrowserView然后跑了一点browserWindow.webContents.executeJavascript("process.exit()"); .我觉得这更丑陋,尽管它确实通过#1 中的上述担忧减轻了。

没有 webcontents.destroy()类型的方法,我不知道有一种方法可以向 Electron 发出信号,表明它需要破坏这个不必要的过程。

我想我可能有一个非常独特的案例,但是有没有比明确执行 process.exit() 更好的方法(或更标准的方法)来处理这个问题? ?

最佳答案

现在有一个 WebContents::forcefullyCrashRenderer() 完成此操作的 API(由 this PR 引入):

Forcefully terminates the renderer process that is currently hosting this webContents. This will cause the render-process-gone event to be emitted with the reason=killed || reason=crashed. Please note that some webContents share renderer processes and therefore calling this method may also crash the host process for other webContents as well.

关于process - Electron 是否有杀死无用渲染器进程的标准方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60661917/

相关文章:

android - 无法在 Debian 9 上为 android 编译 Chromium - 无法创建文件。文件名太长

css - 删除 CSS 声明会破坏 block 中的其他声明,但仅适用于 Chrome 中的按钮

c++ - 处理创建进程的 AppCrash

java - 为什么我无法以这种方式关闭我的 JAR 可执行文件?

node.js - 从 Electron-forge 应用程序中使用 Express 提供静态文件

npm - “Failed to load gRPC binary module because it was not installed for the current system”仅在Windows上

javascript - 检测 Tab 重复事件

Python 另一个应用程序启动

C# 启动进程在 Pocket PC Windows CE 上最小化/隐藏

javascript - 如何确保 React 组件的状态正确?