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.
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:
où 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 tache 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 taches 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 taches 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 taches 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 taches. 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!

Outils d'IA chauds

Undress AI Tool
Images de déshabillage gratuites

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

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

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
échangez les visages dans n'importe quelle vidéo sans effort grace à notre outil d'échange de visage AI entièrement gratuit?!

Article chaud

Outils chauds

Bloc-notes++7.3.1
éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Il existe trois fa?ons courantes d'initier des demandes HTTP dans Node.js: utilisez des modules intégrés, Axios et Node-Fetch. 1. Utilisez le module HTTP / HTTPS intégré sans dépendances, ce qui convient aux scénarios de base, mais nécessite un traitement manuel de la couture des données et de la surveillance des erreurs, tels que l'utilisation de https.get () pour obtenir des données ou envoyer des demandes de post via .write (); 2.AXIOS est une bibliothèque tierce basée sur la promesse. Il a une syntaxe concise et des fonctions puissantes, prend en charge l'async / attendre, la conversion JSON automatique, l'intercepteur, etc. Il est recommandé de simplifier les opérations de demande asynchrones; 3.Node-Fetch fournit un style similaire à la récupération du navigateur, basé sur la promesse et la syntaxe simple

Les types de données JavaScript sont divisés en types primitifs et types de référence. Les types primitifs incluent la cha?ne, le nombre, le booléen, le nul, un non défini et le symbole. Les valeurs sont immuables et les copies sont copiées lors de l'attribution des valeurs, de sorte qu'elles ne se affectent pas; Les types de référence tels que les objets, les tableaux et les fonctions stockent les adresses de mémoire, et les variables pointant vers le même objet s'afferchent mutuellement. Le typeof et l'instance de OFF peuvent être utilisés pour déterminer les types, mais prêtent attention aux problèmes historiques de typeofnull. Comprendre ces deux types de différences peut aider à écrire un code plus stable et fiable.

Quel framework JavaScript est le meilleur choix? La réponse est de choisir la plus appropriée selon vos besoins. 1.RIATT est flexible et gratuit, adapté aux projets moyens et grands qui nécessitent une personnalisation élevée et des capacités d'architecture d'équipe; 2. Angular fournit des solutions complètes, adaptées aux applications au niveau de l'entreprise et à la maintenance à long terme; 3. Vue est facile à utiliser, adaptée à des projets de petite et moyenne taille ou à un développement rapide. De plus, s'il existe une pile technologique existante, la taille de l'équipe, le cycle de vie du projet et si le RSS est nécessaire sont également des facteurs importants dans le choix d'un cadre. En bref, il n'y a pas absolument le meilleur cadre, le meilleur choix est celui qui convient à vos besoins.

Bonjour, développeurs JavaScript! Bienvenue dans JavaScript News de cette semaine! Cette semaine, nous nous concentrerons sur: le différend de marque d'Oracle avec Deno, les nouveaux objets Time JavaScript sont pris en charge par les navigateurs, les mises à jour Google Chrome et certains outils de développeurs puissants. Commen?ons! Le différend de marque d'Oracle avec la tentative de Deno Oracle d'enregistrer une marque "JavaScript" a provoqué la controverse. Ryan Dahl, le créateur de Node.js et Deno, a déposé une pétition pour annuler la marque, et il pense que JavaScript est un niveau ouvert et ne devrait pas être utilisé par Oracle

La promesse est le mécanisme central pour gérer les opérations asynchrones en JavaScript. Comprendre les appels de cha?ne, la gestion des erreurs et les combinants est la clé pour ma?triser leurs applications. 1. L'appel de la cha?ne renvoie une nouvelle promesse à travers. Puis () pour réaliser la concaténation des processus asynchrones. Chaque .then () re?oit le résultat précédent et peut renvoyer une valeur ou une promesse; 2. La gestion des erreurs doit utiliser .catch () pour attraper des exceptions pour éviter les défaillances silencieuses, et peut renvoyer la valeur par défaut dans Catch pour continuer le processus; 3. Combinateurs tels que promesse.all () (réussi avec succès uniquement après tout succès), promesse.race () (le premier achèvement est retourné) et promesse.allsetTled () (en attente de toutes les achèvements)

Cacheapi est un outil fourni par le navigateur pour mettre en cache les demandes de réseau, qui est souvent utilisée en conjonction avec travailleur de service pour améliorer les performances du site Web et l'expérience hors ligne. 1. Il permet aux développeurs de stocker manuellement des ressources telles que des scripts, des feuilles de style, des photos, etc.; 2. Il peut faire correspondre les réponses du cache en fonction des demandes; 3. Il prend en charge la suppression des caches spécifiques ou la nettoyage du cache entier; 4. Il peut mettre en ?uvre des stratégies de priorité de cache ou de priorité de réseau grace à l'écoute des événements Fetch; 5. Il est souvent utilisé pour le support hors ligne, accélérez la vitesse d'accès répétée, préchargement des ressources clés et du contenu de mise à jour des antécédents; 6. Lorsque vous l'utilisez, vous devez faire attention au contr?le de la version du cache, aux restrictions de stockage et à la différence entre le mécanisme de mise en cache HTTP.

Des méthodes intégrées de la matrice JavaScript telles que .map (), .filter () et .reduce () peuvent simplifier le traitement des données; 1) .map () est utilisé pour convertir les éléments un en un pour générer de nouveaux tableaux; 2) .filter () est utilisé pour filtrer les éléments par condition; 3) .reduce () est utilisé pour agréger les données en tant que valeur unique; Une mauvaise utilisation doit être évitée lorsqu'elle est utilisée, entra?nant des effets secondaires ou des problèmes de performance.

La boucle d'événement de JavaScript gère les opérations asynchrones en coordonnant les piles d'appels, les webapis et les files d'attente de taches. 1. La pile d'appels exécute du code synchrone, et lors de la rencontre de taches asynchrones, il est remis à WebAPI pour le traitement; 2. Une fois que le WebAPI a terminé la tache en arrière-plan, il met le rappel dans la file d'attente correspondante (macro tache ou micro tache); 3. La boucle d'événement vérifie si la pile d'appels est vide. S'il est vide, le rappel est retiré de la file d'attente et poussé dans la pile d'appels pour l'exécution; 4. Micro taches (comme Promise. puis) ??prendre la priorité sur les taches macro (telles que Settimeout); 5. Comprendre la boucle d'événements permet d'éviter de bloquer le thread principal et d'optimiser l'ordre d'exécution du code.
