Multithreading
Avec les Web Workers, il est possible d'exécuter du code JavaScript au niveau du système d'exploitation.
Node.js et le multithreading
Il est possible d’utiliser les fonctionnalités de Node.js dans les Web Workers d'Electron, pour ce faire, l’option nodeIntegrationInWorker
doit être défini à true
dans les webPreferences
.
const win = new BrowserWindow({
webPreferences: {
nodeIntegrationInWorker: true
}
})
La propriété nodeIntegrationInWorker
peut être utilisée indépendamment de nodeIntegration
, mais pour cela sandbox
ne doit pas être défini à true
.
Note: Cette option n'est pas disponible dans SharedWorker
s ou Service Worker
s en raison d'incompatibilités dans les politiques de bac à sable.
API disponibles
Tous les modules intégrés de Node.js sont pris en charge par les Web Workers, et les archives asar
peuvent toujours être lues avec les API de Node.js. Toutefois, aucun des modules intégrés d'Electron ne peut être utilisé dans un environnement multithread.
Modules natifs de Node.js
N’importe quel module natif de Node.js peut être chargé directement dans les Web Workers, mais il est fortement recommandé de ne pas le faire. La plupart des modules natifs existants ont été écrits en supposant un environnement mono-thread, leur utilisation dans les Web Workers peut entrainer des crash et des corruptions de mémoire.
Notez que même si un module natif de Node.js est thread-safe, il n’est cependant pas prudent de le charger dans un Web Worker car la fonction process.dlopen
n’est pas thread-safe.
La seule façon pour l’instant de charger un module natif en toute sécurité, est de s’assurer que l’application ne charge aucun module natif une fois les Web Workers démarrés.
process.dlopen = () => {
throw new Error('Load native module is not safe')
}
const worker = new Worker('script.js')