【问题标题】:Why Electron spawns a process per each window?为什么 Electron 每个窗口都生成一个进程?
【发布时间】:2019-12-22 23:35:23
【问题描述】:

我正在开发具有多个窗口的电子应用程序。假设我有一个主窗口和几个子窗口。

如果我从主进程打开 google.com 创建 20 个子窗口,它会生成大约 23 个 Electron 进程(每个窗口一个 + GPU 进程 + 其他),并且在我的 Windows 10 机器上消耗大约 800 MB 的内存.这显然很多。

const {app, BrowserWindow} = require('electron')

let mainWindow

const webPreferences = {
  sandbox: true
};

function createWindow () {
  mainWindow = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences
  })

  mainWindow.loadFile('index.html')

  for (var t = 0; t < 20; t++) {
    const childWindow = new BrowserWindow({
      webPreferences
    })

    childWindow.loadURL('https://google.com')
  }
}

app.on('ready', createWindow)

Task Manager with 23 Electron processes

我知道这就是 Chromium 的工作方式 - 每个选项卡都是一个单独的进程,所以如果一个选项卡坏了,整个浏览器和其他选项卡都是活动的。我对此毫不怀疑,但我注意到一件有趣的事情。如果我按照here 的描述使用本机window.open,它神秘地只产生4个进程。不知何故,它将所有“窗口”进程组合成一个单一的 + GPU + 其他东西,总共消耗 400 MB,这是更好的结果。

const {app, BrowserWindow} = require('electron')

let mainWindow

const webPreferences = {
  sandbox: true // without sandboxing it spawns 23 processes again :(
};

function createWindow () {
  mainWindow = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences
  })

  mainWindow.loadFile('index.html')

  mainWindow.webContents.on('new-window', (event, url, frameName, disposition, options) => {
    event.preventDefault()
    const win = new BrowserWindow({
      ...options,
      show: false,
      webPreferences
    })
    win.once('ready-to-show', () => win.show())
    if (!options.webContents) {
      win.loadURL(url) // existing webContents will be navigated automatically
    }
    event.newGuest = win
  })
}

app.on('ready', createWindow)

还有 index.html

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Hello World!</title>
  </head>
  <body>
    <h1>Hello World!</h1>
    <script>
        for (var t = 0; t < 20; t++) {
            window.open('https://google.com');
        }
    </script>
  </body>
</html>

Task Manager with 4 Electron processes

如果我从主进程(第一个 sn-p)创建所有子窗口,有没有办法让所有子窗口只有一个进程?如果有人能解释为什么它会这样工作,那就太好了。

附:我正在使用带有 Electron 6.0.2 运行时的电子提琴手来运行这些 sn-ps

【问题讨论】:

  • 出于同样的原因,Chrome 会为每个选项卡生成一个新进程; Electron 只是 Chromium 渲染引擎的一个包装器。您在这里遇到的问题是一些人对 Electron 等平台持批评态度的主要原因 - 通过 Web 渲染引擎运行“本机”应用程序的巨大开销。
  • 请仔细阅读问题。我知道这是一个包装。问题是为什么如果我在主进程中创建一个窗口,它会产生很多进程,但同时它在浏览器进程中的每个窗口中只产生一个进程。

标签: javascript typescript electron


【解决方案1】:

更新:正在删除亲和力,请参阅https://github.com/electron/electron/pull/26874

affinity 选项可以解决问题。具有相同亲和性的 Windows 将聚集在一个进程中。

可以在此处找到有关此功能的更多详细信息

https://github.com/electron/electron/pull/11501

这里

https://electronjs.org/docs/api/browser-window#new-browserwindowoptions

【讨论】:

    猜你喜欢
    • 2014-07-12
    • 2017-01-17
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 2011-12-27
    • 1970-01-01
    • 2017-08-18
    • 1970-01-01
    相关资源
    最近更新 更多