文章目录
1. 主进程与渲染进程分离
Electron 应用架构本身就基于多进程模型:
- 主进程(Main Process):负责管理应用的生命周期、创建窗口等
- 渲染进程(Renderer Process):负责展示网页内容,每个窗口运行在独立的渲染进程中
这种设计天然支持并发,因为每个进程可以并行运行。
2. Node.js 多线程支持
在 Electron 中,你可以利用 Node.js 提供的多线程能力:
Worker Threads
Node.js 的 worker_threads
模块允许你在主进程或渲染进程中创建真正的线程:
const { Worker, isMainThread, parentPort, workerData } = require('worker_threads');
if (isMainThread) {
// 主线程
const worker = new Worker(__filename, {
workerData: { num: 10 }
});
worker.on('message', (result) => {
console.log('Result from worker:', result);
});
} else {
// 工作线程
const { num } = workerData;
// 执行计算密集型任务
const result = fibonacci(num);
parentPort.postMessage(result);
}
function fibonacci(n) {
if (n === 0 || n === 1) return n;
let a = 0;
let b = 1;
for (let i = 2; i <= n; i++) {
const c = a + b;
a = b;
b = c;
}
return b;
}
Cluster 模块
Node.js 的 cluster 模块可以在主进程中创建多个子进程来处理负载:
const cluster = require('cluster');
const numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
// 主进程创建工作者进程
for (let i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on('exit', (worker) => {
console.log(`Worker ${worker.process.pid} died`);
cluster.fork(); // 重启死亡的工作者进程
});
} else {
// 工作者进程执行任务
// 这里可以启动你的应用逻辑
}
3. 渲染进程中的 Web Workers
在渲染进程中,你可以使用标准的 Web Workers 来执行后台任务:
// 在渲染进程中
const worker = new Worker('worker.js');
worker.postMessage({ command: 'calculate', data: [1, 2, 3] });
worker.onmessage = function(event) {
console.log('Received result from worker:', event.data);
};
对应的 worker.js
文件:
self.onmessage = function(event) {
const { command, data } = event.data;
if (command === 'calculate') {
// 执行计算任务
const result = data.reduce((sum, val) => sum + val, 0);
self.postMessage({ result });
}
};
4. Electron 特有的多进程通信
Electron 提供了 IPC(进程间通信)机制来协调主进程和渲染进程之间的通信:
主进程监听消息
const { ipcMain } = require('electron');
ipcMain.on('asynchronous-message', (event, arg) => {
console.log(arg); // 打印收到的消息
event.reply('asynchronous-reply', 'pong');
});
ipcMain.handle('do-heavy-work', async (event, data) => {
// 执行耗时操作
const result = await heavyComputation(data);
return result;
});
渲染进程发送消息
const { ipcRenderer } = require('electron');
ipcRenderer.send('asynchronous-message', 'ping');
ipcRenderer.on('asynchronous-reply', (event, arg) => {
console.log(arg); // 打印回复的消息
});
// 使用 handle 方式
async function doWork() {
const result = await ipcRenderer.invoke('do-heavy-work', someData);
console.log(result);
}
5. 原理总结
Electron 的多线程/多进程原理可以概括为:
- 基于 Chromium 多进程架构:每个渲染器运行在独立的进程中,避免单个页面的崩溃影响整个应用
- Node.js 多线程能力:通过 worker_threads 模块实现真正的多线程执行
- Web Workers:在渲染进程中使用浏览器标准的 Web Workers API
- IPC 通信机制:通过消息传递在不同进程/线程间交换数据
- 资源共享与隔离:各进程拥有独立的内存空间,通过 IPC 实现数据共享