跳转到主要内容

多线程

通过 Web Workers,可以在操作系统级别的线程中运行 JavaScript。

多线程 Node.js

可以在 Electron 的 Web Workers 中使用 Node.js 功能,为此需要在 webPreferences 中将 nodeIntegrationInWorker 选项设置为 true

const win = new BrowserWindow({
webPreferences: {
nodeIntegrationInWorker: true
}
})

nodeIntegrationInWorker 可以独立于 nodeIntegration 使用,但 sandbox 必须设置为 false

注意

由于沙箱策略不兼容,此选项在 SharedWorkerService Worker 中不可用。

可用 API

Node.js 的所有内置模块在 Web Workers 中都受支持,并且可以使用 Node.js API 读取 asar 归档文件。但是,Electron 的任何内置模块都不能在多线程环境中使用。

原生 Node.js 模块

任何原生 Node.js 模块可以直接在 Web Workers 中加载,但强烈建议不要这样做。大多数现有的原生模块都是假设单线程环境编写的,在 Web Workers 中使用它们会导致崩溃和内存损坏。

请注意,即使原生 Node.js 模块是线程安全的,由于 process.dlopen 函数不是线程安全的,仍然不安全地在 Web Worker 中加载它。

目前安全加载原生模块的唯一方法是确保应用程序在 Web Workers 启动后不再加载任何原生模块。

process.dlopen = () => {
throw new Error('Load native module is not safe')
}
const worker = new Worker('script.js')