Electron

多线程 | Multithreading

Multithreading

借助Web Workers,可以在OS级别的线程中运行JavaScript。

多线程Node.js

可以在Electron的Web Workers中使用Node.js功能,为此nodeIntegrationInWorker应该将该选项设置为truein 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')