メインコンテンツへ飛ぶ

マルチスレッド

Web Workers により、JavaScript を OS レベルのスレッドで実行することが可能になります。

マルチスレッド Node.js#

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

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

nodeIntegrationInWorkernodeIntegration とは独立して使用できますが、サンドボックスtrue に設定してはなりません。

利用可能な 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')