Maison > interface Web > js tutoriel > JavaScript parallèle avec paralleljs

JavaScript parallèle avec paralleljs

Christopher Nolan
Libérer: 2025-02-18 08:51:09
original
222 Les gens l'ont consulté

paralleljs: solution élégante de travailleurs Web

ParallelJS fournit une solution élégante aux problèmes qui peuvent survenir lors de l'utilisation d'un travailleur Web, fournissant une API pratique avec des outils d'abstraction et d'assistance pratiques. L'interface de travail introduite par HTML5 permet la création de fonctions avec un temps d'exécution à long terme et des demandes de calcul élevées, qui peuvent être utilisées simultanément pour améliorer la vitesse de réponse du site Web. ParallelJS permet la parallélisation du code JavaScript, tirant parti de la lecture multithrecale simultanée (SMT) d'utiliser plus efficacement les processeurs modernes. La bibliothèque ParallelJS fournit des méthodes telles que spawn, map et reduce, qui sont utilisées pour effectuer des calculs, des données de traitement et une fragmentation agrégée entraîne un parallèle.

L'une des nouvelles possibilités les plus cool apportées par HTML5 est l'interface de travail de l'API des travailleurs Web. Avant cela, nous avons dû adopter quelques conseils pour montrer aux utilisateurs un site Web réactif. L'interface de travail nous permet de créer des fonctions avec un temps d'exécution à long terme et des demandes de calcul élevées. De plus, les instances de travailleurs peuvent être utilisées simultanément, ce qui nous permet de générer un certain nombre de ces travailleurs au besoin. Dans cet article, je vais expliquer pourquoi le multithreading est important et comment l'implémenter en JavaScript à l'aide de paralleljs.

Pourquoi avez-vous besoin de multi-threading?

Il s'agit d'une question raisonnable. Historiquement, la capacité de générer des threads fournit un moyen élégant de diviser le travail dans un processus. Le système d'exploitation est responsable de la planification de l'heure disponible pour chaque thread, de sorte que les threads avec une priorité plus élevée et des charges de travail plus élevées auront la priorité sur les threads inactifs à faible priorité. Au cours des dernières années, le multithreading simultané (SMT) est devenu la clé pour accéder à la puissance de calcul du processeur moderne. La raison est simple: la loi de Moore est toujours valable en termes de nombre de transistors par unité de zone. Cependant, la mise à l'échelle de la fréquence doit être arrêtée pour diverses raisons. Par conséquent, les transistors disponibles doivent être utilisés d'une autre manière. Il est décidé que les améliorations architecturales (telles que SIMD) et le multi-fond représentent le meilleur choix.

Parallel JavaScript with ParallelJS

Pour utiliser SMT, nous devons écrire du code parallèle, c'est-à-dire le code qui s'exécute en parallèle pour obtenir un seul résultat. Nous devons généralement considérer des algorithmes spéciaux, car la plupart des codes séquentiels sont difficiles à paralléliser ou sont très inefficaces. La raison en est la loi d'Amdahl, qui stipule que le ratio d'accélération s est donné par la formule suivante:

Parallel JavaScript with ParallelJS

n est le nombre de travailleurs parallèles (tels que le processeur, le noyau ou le thread), et p est la partie parallèle. À l'avenir, davantage d'architectures multiples reposant sur des algorithmes parallèles peuvent être utilisés. Dans le domaine de l'informatique haute performance, les systèmes GPU et les architectures spéciales telles que Intel Xeon PHI représentent ces plateformes. Enfin, nous devons faire la distinction entre les applications ou algorithmes concurrents généraux et l'exécution parallèle. Le parallélisme est l'exécution simultanée (peut-être pertinente) du calcul. Inversement, la concurrence est une combinaison de processus d'exécution indépendants.

Multi-threading en javascript

Dans JavaScript, nous savons déjà comment rédiger des programmes simultanés, c'est-à-dire en utilisant des fonctions de rappel. Ces connaissances peuvent désormais être transférées à la création d'un programme parallèle! Selon sa propre structure, JavaScript est exécuté dans un seul thread médié par une boucle d'événement (généralement suivant le motif du réacteur). Par exemple, cela nous donne une bonne abstraction pour gérer les demandes asynchrones aux ressources (externes). Il garantit également que les rappels précédemment définis sont toujours tirés dans le même thread d'exécution. Il n'y a pas d'exceptions croisées, de conditions de course ou d'autres problèmes liés aux threads. Cependant, cela ne nous rapproche pas de SMT en JavaScript. Avec l'introduction des interfaces de travailleur, une solution élégante a été trouvée. Du point de vue de l'application principale, le code dans le travailleur Web doit être considéré comme une tâche qui s'exécute simultanément. La communication est également effectuée de cette manière. Nous utilisons l'API du message, qui peut également être utilisé pour la communication à partir de sites Web inclus aux pages hébergées. Par exemple, le code suivant répond aux messages entrants en envoyant un message à l'initiateur.

window.addEventListener('message', function (event) {
    event.source.postMessage('Howdy Cowboy!', event.origin);
}, false);
Copier après la connexion
Copier après la connexion

En théorie, un travailleur Web peut également générer un autre travailleur Web. Cependant, en fait, la plupart des navigateurs l'interdisent. Par conséquent, la seule façon de communiquer entre les travailleurs du Web est par le biais de l'application principale. Les communications via des messages sont effectuées simultanément, donc seules les communications asynchrones (non bloquantes) sont effectuées. Au début, cela peut être étrange dans la programmation, mais cela apporte de nombreux avantages. Plus important encore, notre code ne devrait pas avoir de conditions de course! Examinons un exemple simple d'utilisation de deux paramètres pour représenter le début et la fin de la séquence pour calculer une séquence de nombres premiers en arrière-plan. Tout d'abord, nous créons un fichier appelé prime.js avec le contenu suivant:

onmessage = function (event) {
    var arguments = JSON.parse(event.data);
    run(arguments.start, arguments.end);
};
function run (start, end) {
    var n = start;

    while (n < end) {
        var k = Math.sqrt(n);
        var found = false;

        for (var i = 2; !found && i <= k; i++) {
            found = n % i === 0;
        }

        if (!found) {
            postMessage(n.toString());
        }

        n++;
    }
}
Copier après la connexion
Copier après la connexion

Maintenant, nous avons juste besoin d'utiliser le code suivant dans l'application principale pour démarrer le travailleur d'arrière-plan.

if (typeof Worker !== 'undefined') {
    var w = new Worker('prime.js');
    w.onmessage = function(event) {
        console.log(event);
    };
    var args = { start : 100, end : 10000 };
    w.postMessage(JSON.stringify(args));
}
Copier après la connexion
Copier après la connexion

beaucoup de travail. Ce qui est particulièrement ennuyeux, c'est d'utiliser un autre fichier. Cela produit une belle séparation, mais semble complètement redondant pour les tâches plus petites. Heureusement, il y a une solution. Considérez le code suivant:

var fs = (function () { 
    /* code for the worker */ 
}).toString(); 
var blob = new Blob(
   [fs.substr(13, fs.length - 14)],
   { type: 'text/javascript' }
);
var url = window.URL.createObjectURL(blob);
var worker = new Worker(url);
// Now setup communication and rest as before
Copier après la connexion

Bien sûr, nous voulons peut-être avoir une meilleure solution que de tels numéros magiques (13 et 14), et selon le navigateur, la secours du blob et de la créationObjectUrl doit être utilisé. Si vous n'êtes pas un expert JavaScript, F.Substr (13, Fs.Length - 14) est d'extraire le corps de la fonction. Nous le faisons en convertissant la déclaration de fonction en une chaîne (appelée avec toString ()) et en supprimant la signature de la fonction elle-même.

Les parallèles peuvent-ils aider?

C'est là que ParallelJS entre en jeu. Il fournit une belle API pour une certaine commodité ainsi qu'un travailleur Web. Il comprend de nombreux outils auxiliaires et des abstractions très utiles. Nous fournissons d'abord des données à traiter.

var p = new Parallel([1, 2, 3, 4, 5]);
console.log(p.data);
Copier après la connexion
Le champ de données

produit le tableau fourni. Aucune opération "parallèle" n'a encore été appelée. Cependant, l'instance P contient un ensemble de méthodes, telles que Spawn, qui créera un nouveau travailleur Web. Il renvoie une promesse, ce qui fait de l'utilisation des résultats un jeu d'enfant.

window.addEventListener('message', function (event) {
    event.source.postMessage('Howdy Cowboy!', event.origin);
}, false);
Copier après la connexion
Copier après la connexion

Le problème avec le code ci-dessus est que les calculs ne seront pas vraiment parallèles. Nous ne créons qu'un seul travailleur d'arrière-plan qui traite l'ensemble de la gamme de données à la fois. Ce n'est qu'après le traitement du tableau complet que nous pouvons obtenir le résultat. Une meilleure solution consiste à utiliser la fonction de carte de l'instance parallèle.

onmessage = function (event) {
    var arguments = JSON.parse(event.data);
    run(arguments.start, arguments.end);
};
function run (start, end) {
    var n = start;

    while (n < end) {
        var k = Math.sqrt(n);
        var found = false;

        for (var i = 2; !found && i <= k; i++) {
            found = n % i === 0;
        }

        if (!found) {
            postMessage(n.toString());
        }

        n++;
    }
}
Copier après la connexion
Copier après la connexion

Dans l'exemple précédent, le noyau est très simple et peut être trop simple. Dans un vrai exemple, de nombreuses opérations et fonctions seront impliquées. Nous pouvons utiliser la fonction Require pour inclure les fonctions importées.

if (typeof Worker !== 'undefined') {
    var w = new Worker('prime.js');
    w.onmessage = function(event) {
        console.log(event);
    };
    var args = { start : 100, end : 10000 };
    w.postMessage(JSON.stringify(args));
}
Copier après la connexion
Copier après la connexion
La fonction

Réduction aide à agréger les résultats fragmentés en un seul résultat. Il fournit une abstraction pratique pour collecter des sous-résults et effectuer certaines opérations après avoir connu tous les sous-résults.

Conclusion

ParallelJS nous fournit un moyen élégant d'éviter les problèmes qui peuvent survenir lors de l'utilisation du travailleur Web. De plus, nous obtenons une belle API avec des abstractions et des aides utiles. D'autres améliorations peuvent être intégrées à l'avenir. En plus de pouvoir utiliser SMT dans JavaScript, nous pouvons également vouloir utiliser la vectorisation. S'il est soutenu, Simd.js semble être une approche viable. Dans certains futurs (espérons-le pas trop loin), l'utilisation de GPU pour l'informatique peut également être une option valide. Il y a un wrapper pour CUDA (une architecture informatique parallèle) dans Node.js, mais le code JavaScript d'origine n'est toujours pas possible. Jusque-là, ParallelJS était notre meilleur choix pour profiter des processeurs multicœurs pour gérer l'informatique à long terme. Et toi? Comment utilisez-vous JavaScript pour libérer la puissance du matériel moderne?

FAQ (FAQ) sur paralleljs avec paralleljs

Qu'est-ce que paralleljs et comment cela fonctionne-t-il?

ParallelJS est une bibliothèque JavaScript qui vous permet de paralléliser le traitement des données en tirant parti des processeurs multi-core. Il fonctionne en créant un nouvel objet parallèle et en y passant un tableau de données. Ces données peuvent ensuite être traitées en parallèle à l'aide de la méthode .map(), qui applique la fonction spécifiée à chaque élément du tableau. Retournez ensuite le résultat dans le nouveau tableau.

Comment installer paralleljs?

ParallelJS peut être installé à l'aide de NPM (Node.js Package Manager). Exécutez simplement la commande "NPM Install ParallelJS" dans le terminal. Une fois l'installation terminée, vous pouvez le référencer dans votre fichier JavaScript en utilisant "var parallel = require ('paralleljs');".

Quels sont les avantages de l'utilisation de paralleljs?

ParallelJS vous permet de tirer le meilleur parti de vos tâches de traitement des données avec des processeurs multicœurs. Cela peut considérablement accélérer le temps de traitement sur de grands ensembles de données. Il fournit également une API simple et intuitive qui facilite la parallélisation du code.

Puis-je utiliser des parallèles dans mon navigateur?

Oui, les parallèles peuvent être utilisés dans le navigateur. Vous pouvez l'inclure dans le fichier HTML à l'aide de la balise de script et de l'URL du fichier paralleljs. Une fois inclus, vous pouvez utiliser l'objet parallèle comme dans Node.js.

Comment utiliser la méthode .map() dans paralleljs?

La méthode .map() dans ParallelJS est utilisée pour appliquer une fonction à chaque élément dans un tableau de données. Cette fonction est transmise comme une chaîne à la méthode .map(). Retournez ensuite le résultat dans le nouveau tableau. Par exemple, "var p = nouveau parallèle ([1, 2, 3]); p.map ('fonction (n) {return n * 2;}');" ] Nouveau tableau.

Quelle est la méthode .reduce() dans paralleljs?

La méthode .reduce() dans ParallelJS est utilisée pour réduire le tableau de données en une seule valeur en utilisant la fonction spécifiée. Cette fonction est transmise comme une chaîne à la méthode .reduce(). Par exemple, "var p = nouveau parallèle ([1, 2, 3]); p.reduce ('fonction (a, b) {return a b;}');" renvoie la valeur 6.

Puis-je lier des méthodes dans ParallelJS?

Oui, les méthodes dans les parallèles peuvent être liées entre elles. Par exemple, vous pouvez utiliser la méthode .map() pour traiter les données, puis utiliser la méthode .reduce() pour combiner les résultats en une seule valeur.

Comment gérer les erreurs dans ParallelJS?

Les erreurs dans les parallèles peuvent être gérées à l'aide de la méthode .catch(). Cette méthode accepte une fonction qui est appelée si une erreur se produit pendant le traitement. L'objet d'erreur sera transmis à cette fonction.

Puis-je utiliser des parallèles avec d'autres bibliothèques JavaScript?

Oui, les parallèles peuvent être utilisés avec d'autres bibliothèques JavaScript. Cependant, vous devez vous assurer d'inclure la bibliothèque dans le contexte des travailleurs en utilisant la méthode .require().

ParallelJS convient-il à toutes les tâches de traitement des données?

Bien que les parallèles puissent accélérer considérablement le temps de traitement sur de grands ensembles de données, ce n'est peut-être pas le meilleur choix pour toutes les tâches. Pour les petits ensembles de données, les frais généraux de la création de travailleurs et du transfert de données peuvent l'emporter sur les avantages de la parallélisation. Il est préférable de tester les parallèles avec votre cas d'utilisation spécifique pour voir s'il offre des avantages de performance.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal