Appearance
Worker Threads - Partager la mémoire
Dans le contexte de worker_threads
dans Node.js, "la mémoire partagée" se réfère à la capacité des threads de travailler directement sur la même zone de mémoire, plutôt que de devoir copier et échanger des messages entre eux. Node.js introduit le concept de "SharedArrayBuffer" pour gérer la mémoire partagée entre les threads.
SharedArrayBuffer
SharedArrayBuffer
est un type de données qui permet à plusieurs workers d'accéder à la même zone de mémoire sous-jacente. Cela peut être bénéfique pour certaines applications nécessitant des échanges de données fréquents et à faible latence entre les threads, car cela évite la surcharge de sérialisation et désérialisation.
Comment utiliser SharedArrayBuffer
Création d'un SharedArrayBuffer
Vous pouvez créer un
SharedArrayBuffer
de la même manière que vous créez unArrayBuffer
, en spécifiant la taille en octets.javascriptconst sharedBuffer = new SharedArrayBuffer(1024); // 1024 octets
const sharedBuffer = new SharedArrayBuffer(1024); // 1024 octets
Utilisation avec TypedArray
Pour lire ou écrire dans un
SharedArrayBuffer
, vous devez utiliser unTypedArray
, commeInt32Array
ouFloat64Array
.javascriptconst array = new Int32Array(sharedBuffer);
const array = new Int32Array(sharedBuffer);
Passer SharedArrayBuffer entre threads
Vous pouvez passer directement un
SharedArrayBuffer
comme message entre le thread principal et le worker (ou entre deux workers).javascriptworker.postMessage(sharedBuffer);
worker.postMessage(sharedBuffer);
Atomics
Lors de l'utilisation de la mémoire partagée, il peut y avoir des situations où plusieurs threads essaient d'accéder à la même mémoire simultanément. Cela peut conduire à des conditions de concurrence. Pour garantir la sécurité des opérations sur
SharedArrayBuffer
, Node.js fournit le moduleAtomics
qui offre un ensemble de méthodes pour effectuer des opérations atomiques (indivisibles) sur des données.Par exemple, pour augmenter de manière sûre une valeur dans un
Int32Array
:javascriptAtomics.add(array, index, 1);
Atomics.add(array, index, 1);
Points à considérer
Complexité : Bien que la mémoire partagée permette une communication plus rapide entre les threads, elle introduit également une complexité supplémentaire. Vous devez être très prudent pour éviter les conditions de concurrence.
Portabilité : L'utilisation de
SharedArrayBuffer
a été temporairement désactivée dans la plupart des navigateurs à la suite de vulnérabilités de sécurité (comme Spectre). Bien que cela ne concerne pas directement Node.js, cela montre que la mémoire partagée peut avoir des implications de sécurité.Cas d'utilisation : La mémoire partagée est bénéfique lorsque vous avez besoin d'échanges de données fréquents entre threads. Cependant, pour de nombreux scénarios, le modèle de communication basé sur des messages (sans mémoire partagée) est suffisant et souvent plus simple à mettre en œuvre correctement.