メインコンテンツへスキップ

マルチスレッディング

Web Workers を使用すると、OS レベルのスレッドで JavaScript を実行できます。

マルチスレッド Node.js

Electron の Web Workers で Node.js の機能を使用できます。そのためには、webPreferencesnodeIntegrationInWorker オプションを true に設定する必要があります。

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

nodeIntegrationInWorkernodeIntegration とは独立して使用できますが、sandboxtrue に設定することはできません。

注記: このオプションは、サンドボックス化ポリシーの非互換性のため、SharedWorkerService 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')