Skip to content

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

  1. Création d'un SharedArrayBuffer

    Vous pouvez créer un SharedArrayBuffer de la même manière que vous créez un ArrayBuffer, en spécifiant la taille en octets.

    javascript
    const sharedBuffer = new SharedArrayBuffer(1024); // 1024 octets
    const sharedBuffer = new SharedArrayBuffer(1024); // 1024 octets
  2. Utilisation avec TypedArray

    Pour lire ou écrire dans un SharedArrayBuffer, vous devez utiliser un TypedArray, comme Int32Array ou Float64Array.

    javascript
    const array = new Int32Array(sharedBuffer);
    const array = new Int32Array(sharedBuffer);
  3. Passer SharedArrayBuffer entre threads

    Vous pouvez passer directement un SharedArrayBuffer comme message entre le thread principal et le worker (ou entre deux workers).

    javascript
    worker.postMessage(sharedBuffer);
    worker.postMessage(sharedBuffer);
  4. 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 module Atomics 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:

    javascript
    Atomics.add(array, index, 1);
    Atomics.add(array, index, 1);

Points à considérer

  1. 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.

  2. 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é.

  3. 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.