多线程 | Multithreading
Multithreading
借助Web Workers,可以在OS级别的线程中运行JavaScript。
多线程Node.js
可以在Electron的Web Workers中使用Node.js功能,为此nodeIntegrationInWorker
应该将该选项设置为true
in webPreferences
。
let win = new BrowserWindow{
webPreferences: {
nodeIntegrationInWorker: true
}
})
该nodeIntegrationInWorker
可独立运作的nodeIntegration
,但sandbox
不能设置为true
。
可用的API
Web Workers支持Node.js的所有内置模块,并且asar
仍可以使用Node.js API读取档案。但是,Electron的内置模块在多线程环境下不能使用。
本机Node.js模块
任何本地Node.js模块都可以直接加载到Web Workers中,但强烈建议不要这样做。大多数现有的本地模块都是在假设单线程环境下编写的,在Web Workers中使用它们会导致崩溃和内存损坏。
请注意,即使本机Node.js模块是线程安全的,但将它加载到Web Worker中仍然不安全,因为该process.dlopen
函数不是线程安全的。
现在安全加载本地模块的唯一方法是确保应用程序在Web Workers启动后加载本地模块。
process.dlopen = () => {
throw new Error('Load native module is not safe')
}
let worker = new Worker('script.js')