我知道主进程中的CPU密集型工作会阻止UI进程。我还有一个问题,在主进程中是否长时间的IO操作会阻塞UI。 最近,我使用电子来开发文件管理的桌面应用程序。
我的UI进程使用异步IPC(由Electron提供)告诉主进程从网络中获取文件列表的数据((仅获取文件的元数据,不包含文件内容)
主进程从网络中获取文件列表的数据,然后将文件列表存储到sqlite(我使用TypeORM),然后从sqlite中选择文件列表的一部分,并将其返回给UI进程
有时step2会花费数十秒的时间(例如,我从network提取了10000个文件数据),并且我的UI会变慢。
因此,我有两个问题: +主进程中长时间的IO操作是否会阻塞UI? +在电子应用中执行IO操作(数据库或本地文件)的最佳方法是什么?
答案 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;
});