Aller au contenu principal

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 SharedWorkers ou Service Workers 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')