マルチスレッディング
Web Workers を使用すると、OS レベルのスレッドで JavaScript を実行できます。
マルチスレッド Node.js
Electron の Web Workers で Node.js の機能を使用できます。そのためには、webPreferences
で nodeIntegrationInWorker
オプションを true
に設定する必要があります。
const win = new BrowserWindow({
webPreferences: {
nodeIntegrationInWorker: true
}
})
nodeIntegrationInWorker
は nodeIntegration
とは独立して使用できますが、sandbox
を true
に設定することはできません。
注記: このオプションは、サンドボックス化ポリシーの非互換性のため、SharedWorker
や Service Worker
では使用できません。
使用可能な API
Node.js のすべての組み込みモジュールは Web Workers でサポートされており、asar
アーカイブは Node.js API で引き続き読み取ることができます。ただし、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')