多线程
¥Multithreading
使用 网络工作者,可以在操作系统级线程中运行 JavaScript。
¥With Web Workers, it is possible to run JavaScript in OS-level threads.
多线程 Node.js
¥Multi-threaded Node.js
可以在 Electron 的 Web Workers 中使用 Node.js 功能,为此,nodeIntegrationInWorker
选项应设置为 webPreferences
中的 true
。
¥It is possible to use Node.js features in Electron's Web Workers, to do
so the nodeIntegrationInWorker
option should be set to true
in
webPreferences
.
const win = new BrowserWindow({
webPreferences: {
nodeIntegrationInWorker: true
}
})
nodeIntegrationInWorker
可以独立于 nodeIntegration
使用,但 sandbox
不得设置为 true
。
¥The nodeIntegrationInWorker
can be used independent of nodeIntegration
, but
sandbox
must not be set to true
.
注意:由于沙盒策略不兼容,该选项在 SharedWorker
或 Service Worker
中不可用。
¥Note: This option is not available in SharedWorker
s or Service Worker
s owing to incompatibilities in sandboxing policies.
可用的 API
¥Available APIs
Web Workers 支持 Node.js 的所有内置模块,并且仍然可以使用 Node.js API 读取 asar
存档。然而,Electron 的内置模块都不能在多线程环境中使用。
¥All built-in modules of Node.js are supported in Web Workers, and asar
archives can still be read with Node.js APIs. However none of Electron's
built-in modules can be used in a multi-threaded environment.
原生 Node.js 模块
¥Native Node.js modules
任何原生 Node.js 模块都可以直接在 Web Workers 中加载,但强烈建议不要这样做。大多数现有的原生模块都是假设单线程环境编写的,在 Web Workers 中使用它们将导致崩溃和内存损坏。
¥Any native Node.js module can be loaded directly in Web Workers, but it is strongly recommended not to do so. Most existing native modules have been written assuming single-threaded environment, using them in Web Workers will lead to crashes and memory corruptions.
请注意,即使原生 Node.js 模块是线程安全的,将其加载到 Web Worker 中仍然不安全,因为 process.dlopen
函数不是线程安全的。
¥Note that even if a native Node.js module is thread-safe it's still not safe to
load it in a Web Worker because the process.dlopen
function is not thread
safe.
目前安全加载原生模块的唯一方法是确保应用在 Web Workers 启动后不加载原生模块。
¥The only way to load a native module safely for now, is to make sure the app loads no native modules after the Web Workers get started.
process.dlopen = () => {
throw new Error('Load native module is not safe')
}
const worker = new Worker('script.js')