Maison >interface Web >js tutoriel >Une introduction à Node.js Multithreading

Une introduction à Node.js Multithreading

Lisa Kudrow
Lisa Kudroworiginal
2025-02-08 13:14:10796parcourir

An Introduction to Node.js Multithreading

Points de base

  • JavaScript L'exécution utilise un traitement unique, qui peut provoquer des goulots d'étranglement pour les applications Node.js lors du traitement de plusieurs demandes utilisateur. Le multithreading aide à prévenir ces goulots d'étranglement.
  • Les threads de travailleurs Node.js permettent un traitement asynchrone sur des threads séparés, améliorant ainsi les performances. Cependant, ils ne peuvent pas gérer des objets complexes tels que les connexions de la base de données et doivent être sérialisés lors du passage vers et depuis le fil du travailleur.
  • Node.js Le processus enfant peut démarrer une autre application, passer des données et recevoir des résultats. Ils ne sont pas aussi efficaces que les fils de travail et sont plus à forte intensité de processus, mais peuvent être utilisés lorsqu'ils s'appuient sur des processus externes de Node.js.
  • Le cluster
  • Node.js permet de fournir le même processus pour gérer la charge plus efficacement. Ils peuvent également gérer les redémarrages lorsque les instances échouent et communiquent entre les processus fourchus, mais le code peut devenir de plus en plus complexe.
  • Process Manager et Container Orchestration peuvent exécuter plusieurs instances d'application Node.js sans écrire de code de cluster, ils sont donc idéaux pour les serveurs en temps réel. Les conteneurs simulent les systèmes d'exploitation, permettant aux applications d'exécuter sur un seul appareil ou sur des milliers de machines.

JavaScript L'exécution utilise un traitement de thread unique. Le moteur effectue une seule opération à la fois et doit terminer l'exécution pour effectuer toute autre opération. Cela entraîne rarement des problèmes dans le navigateur, car un seul utilisateur interagit avec l'application. Cependant, l'application Node.js peut traiter des centaines de demandes d'utilisateurs. Le multithreading peut empêcher les goulots d'étranglement de votre application. Considérez une application Web Node.js où un seul utilisateur peut déclencher un calcul JavaScript complexe de 10 secondes. Jusqu'à ce que ce calcul soit terminé, l'application ne sera pas en mesure de traiter les demandes entrantes de tout autre utilisateur. Les langages tels que PHP et Python sont également monomoroliques, mais ils utilisent généralement un serveur Web multithread qui démarre une nouvelle instance de l'interprète à chaque demande. Il s'agit d'une forte intensité de ressources, donc les applications Node.js fournissent généralement leur propre serveur Web léger. Le serveur Web Node.js s'exécute sur un seul thread, mais JavaScript atténue les problèmes de performances avec sa boucle d'événements non bloquante. Les applications peuvent effectuer des opérations asynchrones telles que des fichiers, des bases de données et HTTP fonctionnant sur d'autres threads du système d'exploitation. La boucle d'événements continue de s'exécuter et peut gérer d'autres tâches JavaScript en attendant que l'opération d'E / S se termine. Malheureusement, le code JavaScript à long terme (comme le traitement d'image) peut prendre l'itération actuelle de la boucle d'événement. Cet article explique comment transférer le traitement vers un autre thread en utilisant les méthodes suivantes: - Thread de travail - Sous-processus - Cluster - Process Manager - Container

Node.js Thread du travailleur

Les threads de travail sont équivalents au travailleur Web dans Node.js. Le thread principal passe les données à un autre script qui le traite (de manière asynchrone) sur un thread séparé. Le fil principal continue de s'exécuter et exécute un événement de rappel lorsque le fil du travailleur termine ses travaux.

An Introduction to Node.js Multithreading

Notez que JavaScript utilise son algorithme de clonage structuré pour sérialiser les données en chaînes lors de la transmission des données vers et depuis les threads du travailleur. Il peut contenir des types natifs tels que des chaînes, des nombres, des booléens, des tableaux et des objets - mais pas des fonctions . Vous ne pourrez pas passer des objets complexes, comme les connexions de base de données - parce que la plupart des objets ont des méthodes qui ne peuvent pas être clonées. Cependant, vous pouvez: - Lisez les données de la base de données de manière asynchrone dans le thread principal et transmettez les données de résultat au thread du travailleur. - Créez un autre objet de connexion dans le thread de travailleur. Cela entraînera des coûts de démarrage, mais il peut être possible si votre fonction nécessite d'autres requêtes de base de données dans le cadre du calcul.

L'API du thread de travail de travail Node.js ressemble conceptuellement à l'API des travailleurs Web dans le navigateur, mais il existe des différences de syntaxe. Les navigateurs de support Deno et BUN et les API Node.js.

Démonstration du thread de travail

La démonstration suivante montre un processus Node.js qui écrit l'heure actuelle à la console chaque seconde: ouvrez la démonstration Node.js dans un nouvel onglet de navigateur. Ensuite, commencez un long calcul de rouleau de dés en cours d'exécution sur le fil principal. La boucle complète 100 millions d'itérations, ce qui arrête la sortie du temps:

<code>timer process 12:33:18 PM
timer process 12:33:19 PM
timer process 12:33:20 PM
NO THREAD CALCULATION STARTED...
┌─────────┬──────────┐
│ (index) │  Values  │
├─────────┼──────────┤
│    2    │ 2776134  │
│    3    │ 5556674  │
│    4    │ 8335819  │
│    5    │ 11110893 │
│    6    │ 13887045 │
│    7    │ 16669114 │
│    8    │ 13885068 │
│    9    │ 11112704 │
│   10    │ 8332503  │
│   11    │ 5556106  │
│   12    │ 2777940  │
└─────────┴──────────┘
processing time: 2961ms
NO THREAD CALCULATION COMPLETE

timer process 12:33:24 PM
</code>
Une fois

terminé, le même calcul sera démarré sur le fil du travailleur. Lorsque le traitement des dés se produit, l'horloge continue de fonctionner:

<code>WORKER CALCULATION STARTED...
  timer process 12:33:27 PM
  timer process 12:33:28 PM
  timer process 12:33:29 PM
┌─────────┬──────────┐
│ (index) │  Values  │
├─────────┼──────────┤
│    2    │ 2778246  │
│    3    │ 5556129  │
│    4    │ 8335780  │
│    5    │ 11114930 │
│    6    │ 13889458 │
│    7    │ 16659456 │
│    8    │ 13889139 │
│    9    │ 11111219 │
│   10    │ 8331738  │
│   11    │ 5556788  │
│   12    │ 2777117  │
└─────────┴──────────┘
processing time: 2643ms
WORKER CALCULATION COMPLETE

  timer process 12:33:30 PM
</code>

Le processus de travail est un peu plus rapide que le fil principal car il peut se concentrer sur une tâche.

... (Le contenu restant est omis car la longueur est trop longue. L'idée de base a été résumé plus tôt. Le contenu ultérieur est des exemples de code et des explications plus détaillées. Vous pouvez lire sélectivement le texte d'origine au besoin.)

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