【问题标题】:Does long time IO operation in Electron main process block the UIElectron 主进程中长时间的 IO 操作会阻塞 UI
【发布时间】:2019-09-15 05:52:49
【问题描述】:

我知道主进程中的 CPU 密集型工作会阻塞 UI 进程。我还有一个问题,主进程中长时间的 IO 操作会阻塞 UI。 最近用electron开发了一个文件管理的桌面应用。

第 1 步:

我的 UI 进程使用异步 IPC(由 Electron 提供)告诉主进程从网络中获取文件列表的数据,(仅获取文件的元数据,不包含文件内容)

第 2 步:

主进程从网络中获取文件列表的数据,然后将文件列表存储到sqlite中(我使用TypeORM),然后从sqlite中选择部分文件列表,并将它们返回给UI进程


有时step2需要几十秒(比如我从网络获取10000条文件数据),我的UI会变慢。

所以,我有两个问题: + 主进程中长时间的 IO 操作会阻塞 UI 吗? + 在电子应用中进行 IO 操作(数据库或本地文件)的最佳方式是什么?

【问题讨论】:

  • 在主进程和渲染进程之间移动大块数据可能会减慢 Electron。你如何“让他们回复 UI 流程”?
  • 我使用 ipc 异步,只是转换纯 json 字符串 @PelayoMéndez 现在我尝试将我的数据管理器逻辑从主进程移动到另一个进程
  • 是的,尝试这样做。阻塞主进程不是一个好主意。为了使操作真正异步,它应该在它的进程上运行。检查这篇文章是否包含在一个真实世界示例中关于这个问题的一个很好的解释:medium.com/actualbudget/…

标签: javascript node.js electron


【解决方案1】:

I/O 可能会阻塞您的应用程序。 Node 提供阻塞和非阻塞 I/O 操作。您需要使用非阻塞变体。

Node 文档有一个关于blocking vs non-blocking I/O 的部分。该页面的两个代码示例,一个阻塞,一个非阻塞:

const fs = require('fs');
const data = fs.readFileSync('/file.md'); // blocks here until file is read
const fs = require('fs');
fs.readFile('/file.md', (err, data) => {
    if (err) throw err;
});

【讨论】:

  • 请注意,即使 OP 在 Node 中使用阻塞 I/O 操作,它仍然不应该阻塞电子 UI 线程。
  • @BenjaminGruenbaum 我使用异步 IO 操作,但我不知道为什么当 IO 操作花费数十秒时我的 ui 线程仍然变慢。而且我的 sqlite 操作也是异步方式,正如这里提到的 typeorm.io/#
  • 我建议您阅读 devtools 文档并使用分析器,这是天赐之物,它可以准确地告诉您程序在哪里花费时间:]
【解决方案2】:

第二个问题(“最好的方法是什么?”)是固执己见的题外话,所以我将专注于第一个问题:

主进程中长时间的 IO 操作会阻塞 UI 吗?

不,它没有。 electron 中的 I/O 发生在 Chromium 端或 Node.js 端——在这两种情况下,JavaScript 的 I/O 执行模型都使用事件循环。该操作被排队,然后在后台的线程池上执行(例如 dns 查询)或使用本机操作系统异步非阻塞 I/O 设施(例如套接字写入)。

需要注意的是,浏览器确实提供了一些(较旧的)阻塞 API(如同步 XMLHttpRequest),但您可能不会使用这些。

更多详情请见our event loop and timers tutorial

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-12
    • 1970-01-01
    • 1970-01-01
    • 2019-10-18
    • 1970-01-01
    相关资源
    最近更新 更多