recherche
Maisoninterface Webjs tutorielJavaScript parallèle avec paralleljs

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);

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++;
    }
}

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));
}

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

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);
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);

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++;
    }
}

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));
}
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
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
Remplacer les caractères de chaîne en javascriptRemplacer les caractères de chaîne en javascriptMar 11, 2025 am 12:07 AM

Explication détaillée de la méthode de remplacement de la chaîne JavaScript et de la FAQ Cet article explorera deux façons de remplacer les caractères de chaîne dans JavaScript: le code JavaScript interne et le HTML interne pour les pages Web. Remplacer la chaîne dans le code JavaScript Le moyen le plus direct consiste à utiliser la méthode Remplace (): str = str.replace ("trouver", "remplacer"); Cette méthode remplace uniquement la première correspondance. Pour remplacer toutes les correspondances, utilisez une expression régulière et ajoutez le drapeau global G: str = str.replace (/ fi

Comment créer et publier mes propres bibliothèques JavaScript?Comment créer et publier mes propres bibliothèques JavaScript?Mar 18, 2025 pm 03:12 PM

L'article discute de la création, de la publication et du maintien des bibliothèques JavaScript, en se concentrant sur la planification, le développement, les tests, la documentation et les stratégies de promotion.

Comment optimiser le code JavaScript pour les performances dans le navigateur?Comment optimiser le code JavaScript pour les performances dans le navigateur?Mar 18, 2025 pm 03:14 PM

L'article traite des stratégies pour optimiser les performances JavaScript dans les navigateurs, en nous concentrant sur la réduction du temps d'exécution et la minimisation de l'impact sur la vitesse de chargement de la page.

Effets de la matrice jQueryEffets de la matrice jQueryMar 10, 2025 am 12:52 AM

Apportez des effets de film de matrice à votre page! Ceci est un plugin jQuery cool basé sur le célèbre film "The Matrix". Le plugin simule les effets de caractère vert classique dans le film, et sélectionnez simplement une image et le plugin le convertira en une image de style matrice remplie de caractères numériques. Venez et essayez, c'est très intéressant! Comment ça marche Le plugin charge l'image sur la toile et lit le pixel et les valeurs de couleur: data = ctx.getImagedata (x, y, settings.grainsize, settings.grainsize) .data Le plugin lit intelligemment la zone rectangulaire de l'image et utilise jQuery pour calculer la couleur moyenne de chaque zone. Ensuite, utilisez

Comment déboguer efficacement le code JavaScript à l'aide d'outils de développeur de navigateur?Comment déboguer efficacement le code JavaScript à l'aide d'outils de développeur de navigateur?Mar 18, 2025 pm 03:16 PM

L'article traite du débogage efficace de JavaScript à l'aide d'outils de développeur de navigateur, de se concentrer sur la définition des points d'arrêt, de l'utilisation de la console et d'analyser les performances.

Comment construire un simple curseur jQueryComment construire un simple curseur jQueryMar 11, 2025 am 12:19 AM

Cet article vous guidera pour créer un carrousel d'image simple à l'aide de la bibliothèque JQuery. Nous utiliserons la bibliothèque BXSLider, qui est construite sur jQuery et offre de nombreuses options de configuration pour configurer le carrousel. De nos jours, Picture Carrousel est devenue une fonctionnalité incontournable sur le site Web - une image vaut mieux que mille mots! Après avoir décidé d'utiliser le carrousel d'image, la question suivante est de savoir comment la créer. Tout d'abord, vous devez collecter des images de haute qualité et haute résolution. Ensuite, vous devez créer un carrousel d'image en utilisant HTML et un code JavaScript. Il existe de nombreuses bibliothèques sur le Web qui peuvent vous aider à créer des carrousels de différentes manières. Nous utiliserons la bibliothèque BXSLider open source. La bibliothèque Bxslider prend en charge la conception réactive, de sorte que le carrousel construit avec cette bibliothèque peut être adapté à n'importe quel

Amélioration du balisage structurel avec JavaScriptAmélioration du balisage structurel avec JavaScriptMar 10, 2025 am 12:18 AM

Points clés Le marquage structuré amélioré avec JavaScript peut considérablement améliorer l'accessibilité et la maintenabilité du contenu de la page Web tout en réduisant la taille du fichier. JavaScript peut être utilisé efficacement pour ajouter dynamiquement des fonctionnalités aux éléments HTML, tels que l'utilisation de l'attribut CITE pour insérer automatiquement les liens de référence en références de bloc. L'intégration de JavaScript avec des balises structurées vous permet de créer des interfaces utilisateur dynamiques, telles que des panneaux d'onglet qui ne nécessitent pas de rafraîchissement de page. Il est crucial de s'assurer que les améliorations JavaScript ne gênent pas la fonctionnalité de base des pages Web; même si JavaScript est désactivé, la page doit rester fonctionnelle. La technologie avancée JavaScript peut être utilisée (

Comment télécharger et télécharger des fichiers CSV avec AngularComment télécharger et télécharger des fichiers CSV avec AngularMar 10, 2025 am 01:01 AM

Les ensembles de données sont extrêmement essentiels pour créer des modèles d'API et divers processus métier. C'est pourquoi l'importation et l'exportation de CSV sont une fonctionnalité souvent nécessaire. Dans ce tutoriel, vous apprendrez à télécharger et à importer un fichier CSV dans un

See all articles

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semainesBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semainesBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semainesBy尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

MantisBT

MantisBT

Mantis est un outil Web de suivi des défauts facile à déployer, conçu pour faciliter le suivi des défauts des produits. Cela nécessite PHP, MySQL et un serveur Web. Découvrez nos services de démonstration et d'hébergement.

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

Puissant environnement de développement intégré PHP

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

DVWA

DVWA

Damn Vulnerable Web App (DVWA) est une application Web PHP/MySQL très vulnérable. Ses principaux objectifs sont d'aider les professionnels de la sécurité à tester leurs compétences et leurs outils dans un environnement juridique, d'aider les développeurs Web à mieux comprendre le processus de sécurisation des applications Web et d'aider les enseignants/étudiants à enseigner/apprendre dans un environnement de classe. Application Web sécurité. L'objectif de DVWA est de mettre en pratique certaines des vulnérabilités Web les plus courantes via une interface simple et directe, avec différents degrés de difficulté. Veuillez noter que ce logiciel