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
SharedArrayBufferde la même manière que vous créez unArrayBuffer, en spécifiant la taille en octets.javascriptconst sharedBuffer = new SharedArrayBuffer(1024); // 1024 octetsconst sharedBuffer = new SharedArrayBuffer(1024); // 1024 octetsUtilisation avec TypedArray
Pour lire ou écrire dans un
SharedArrayBuffer, vous devez utiliser unTypedArray, commeInt32ArrayouFloat64Array.javascriptconst array = new Int32Array(sharedBuffer);const array = new Int32Array(sharedBuffer);Passer SharedArrayBuffer entre threads
Vous pouvez passer directement un
SharedArrayBuffercomme 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 moduleAtomicsqui 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
SharedArrayBuffera é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.