Maison >interface Web >js tutoriel >Une introduction à Node.js Multithreading
Points de base
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.
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!