Electron主进程中的长时间IO操作是否会阻塞UI

时间:2019-04-25 18:14:05

标签: javascript node.js electron

我知道主进程中的CPU密集型工作会阻止UI进程。我还有一个问题,在主进程中是否长时间的IO操作会阻塞UI。 最近,我使用电子来开发文件管理的桌面应用程序。

步骤1:

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

步骤2:

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


有时step2会花费数十秒的时间(例如,我从network提取了10000个文件数据),并且我的UI会变慢。

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

2 个答案:

答案 0 :(得分:0)

第二个问题(“什么是最好的方法?”)是自以为是的话题,因此我将重点关注第一个问题:

  

长时间在主进程中进行IO操作是否会阻塞UI?

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

一个警告是,浏览器确实提供了一些(较旧的)被阻塞的API(例如同步XMLHttpRequest),但是您可能没有使用它们。

有关更多详细信息,请参见our event loop and timers tutorial

答案 1 :(得分:0)

I / O可能会阻止您的应用程序。节点提供阻塞和非阻塞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;
});