【问题标题】:Alternatives to Electron IPC for Large Messages大型消息的电子 IPC 的替代方案
【发布时间】:2020-07-16 15:45:33
【问题描述】:

我有一个 React/Electron 应用程序分为 2 个(并且可以选择更多)进程 - 一个前端、一个后端,可能还有许多“检查器”窗口。它们都通过 Redux 使用 redux-electron-store 连接,使用 IPC 使所有实例保持同步,主进程是“主”节点,渲染器被发送差异操作。后端处理大量图像和 XML,可能有数百个,并将它们发送到 Redux 进行存储,导致整个事情挂起。前端需要缩略图,其他两个窗口都需要解析的 XML 数据。

最初,我将每个项目作为其自己的 Redux 操作发送,导致例如 200 个操作,这将其冻结。我还尝试错开这些,每 2 秒左右发送一个,这很好,直到性能开始下降。然后我将其更改为批处理,对一组文件的每种处理类型(缩略图或解析 XML)执行 1 个操作,这导致 2 个 48MB 和 37MB 或类似的有效负载,这更好,但仍然冻结了一切好几秒钟。

我在主进程中放了一个小间隔计数器,看看是主进程还是渲染器挂起,似乎主进程在冻结,大概是在它摄取并重新发送这些大消息时(自然这不是一个非常万无一失的此处建立因果关系的方法)。所以我不太确定如何重组事情来停止冻结主进程。我们有两个想法:

  1. 将缩略图和 XML 数据抽象到 Redux 的不同部分,它不会被 IPC 同步,而是在后端有一个小型本地 websocket 服务器,可以直接与请求数据的进程通信,它将把它放在它自己的 Redux 中,而不是同步它。这也许可以用 WebWorkers 来完成?这应该可以避免向主进程发送大负载,并且 web worker 应该避免冻结渲染器。

  2. 一个合作伙伴的想法是有一个本地数据库,大概可以读取/写入,其他窗口需要以某种方式得到通知,并可能将其存储在组件状态而不是 Redux 中。我不喜欢这个,因为引入了更多的 I/O 操作,需要维护这个文件,以及一些额外的补丁来通知需要它的组件,写入完成,然后去读取相同的数据。

IPC 目前已全部异步完成,但仍会阻塞。

这一切都给人的印象是,冻结渲染器的大消息是唯一的问题,而不是 Redux 处理它,这也可能是正确的,但是在解决方案 1 中将其从同步中移除将涵盖这两个问题.

如果有人对如何更好地构建它有任何想法,我将非常感激。

【问题讨论】:

    标签: performance redux websocket electron ipc


    【解决方案1】:

    如果仅要求在渲染器之间共享这些操作并且所有渲染器具有相同的来源,您可以尝试使用BroadcastChannel 作为 IPC 的替代方案。

    您也可以尝试在渲染器进程中处理数据并将更新发送到其他渲染器,而完全不涉及 manin 进程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-25
      • 2023-04-07
      • 1970-01-01
      • 2016-03-15
      • 1970-01-01
      • 2014-04-09
      • 2011-10-26
      • 2022-11-22
      相关资源
      最近更新 更多