2017-10-21 77 views
0

J'essaie de trier un tableau de 10 millions de valeurs. Trouvé nouvelle technologie de Microsoft - Napa.js qui permet l'utilisation multi-threading avec Node.js.Node.js tâches parallèles avec Napajs

Il nous utilisons le code suivant:

const napa = require('napajs') 
const zone = napa.zone.create('zone', { workers: 4 }); 
zone.execute((...args) => { 
    // here I can take anything I want to execute in a native thread 
    // but it is also possible to implement shared memory for all 
    // threads, but I can't find out how 
}, [args]) 

Aidez-moi à comprendre, quoi allouer. qu'est-ce que gestionnaire et comment utiliser TransferContext si nécessaire pour cette tâche.

Ant au moins comment utiliser toutes ces connaissances pour créer de la mémoire partagée pour mes discussions?

Répondre

1

Une mise à jour:

Napa.js (> = 0.2.0) supporte maintenant le transport de types JavaScript intégré tel que SharedArrayBuffer sans copier. Vous pouvez trouver l'exemple Parallel Quick Sort pour ce problème particulier.


Ceci est un problème intéressant. Actuellement, les arguments passant entre les travailleurs sont sérialisés/désérialisés par défaut dans Napa.js. Nous souhaitons peut-être une meilleure solution de partage de matrice entre les travailleurs sans copie.

j'ai vu la faisabilité comme suit:

  1. On suppose que nous utilisons int32 tableau pour contenir les valeurs de 10M dans le principal fil JS .
  2. Créez un addon pour obtenir le pointeur brut du tableau via v8 :: Int32Array :: Buffer() :: Externalize(). (Cela permet à l'utilisateur de gérer la mémoire, il se peut que nous ayons besoin d'une gestion du cycle de vie)
  3. Passez le pointeur brut à un autre worker.
  4. Travailleur pour créer un v8 :: Int32Array à partir d'un pointeur brut (via un ArrayBuffer externalisé).

Ce modèle est si commun que je pense que ce pourrait être une bonne idée de l'avoir inclus dans Napa.js. J'ai placé une demande de fonctionnalité Introduce Buffer class that can be transferred across workers without copying.

BTW, TransportContext est utilisé pour transférer std::shared_ptr d'un travailleur à un autre travailleur, dans ce cas, je pense que c'est plus sur la façon dont nous partageons la matrice entre les travailleurs.

+0

Merci pour la réponse! Comme votre [Feuille de route] (https://github.com/Microsoft/napajs/wiki/roadmap). Réjouissez-vous de ces choses sont faites –