Le mécanisme asynchrone du nœud est basé sur des « événements ». Toutes les requêtes d'E/S, de communication réseau et de base de données sont exécutées de manière non bloquante et les résultats renvoyés sont traités par la boucle d'événements. Le nœud ne traitera qu'un seul événement à la fois et entrera immédiatement dans la boucle d'événements pour vérifier les événements suivants une fois terminé. De cette manière, le processeur et la mémoire peuvent se concentrer sur le traitement d'une seule chose en même temps, tout en essayant de permettre l'exécution en parallèle d'E/S et d'autres opérations fastidieuses.
L'environnement d'exploitation de ce tutoriel : système Windows 7, nodejs version 16, ordinateur DELL G3.
NodeJS est monothread. Le monothread présente les avantages suivants :
simple et
hautes performances, évitant les surcharges de changement de thread fréquentes et
la faible utilisation des ressources. Parce qu'il est monothread, l'utilisation de la mémoire est toujours très faible dans des conditions de charge élevée
. -sûr, pas de verrouillage, Comment résoudre les problèmes de forte concurrence tels que le déverrouillage et le blocage
?
Node utilise des E/S asynchrones et pilotées par les événements (fonction de rappel) pour résoudre le problème de la concurrence élevée.
De manière générale, les solutions à haute concurrence fourniront un modèle multithread, fournissant un thread pour chaque logique métier et compensant le temps nécessaire aux appels d'E/S synchrones via la commutation de thread système. Comme Apache, il y a un thread par requête.
NodeJS utilise un modèle monothread et utilise des méthodes de requête asynchrones pour toutes les E/S afin d'éviter les changements de contexte fréquents. Il maintient une file d'attente d'événements lorsque NodeJS est exécuté ; , chaque demande d'E/S asynchrone sera poussée vers la file d'attente des événements pour être exécutée une fois terminée.
Le mécanisme asynchrone de NodeJS est basé sur les événements. Toutes les requêtes d'E/S, de communication réseau et de base de données sont exécutées de manière non bloquante et les résultats renvoyés sont traités par la boucle d'événements . Comme le montre l'image :
Le processus Node.js ne traitera qu'un seul événement à la fois. Une fois terminé, il entrera immédiatement dans la boucle d'événements pour vérifier les événements suivants. L'avantage de ceci est que le processeur et la mémoire peuvent se concentrer sur le traitement d'une seule chose en même temps, tout en essayant de permettre l'exécution en parallèle d'E/S et d'autres opérations fastidieuses. Pour les attaques de connexion à faible vitesse, Node.js ajoute uniquement des requêtes à la file d'attente des événements et attend la réponse du système d'exploitation. Il n'y a donc pas de surcharge multithread, ce qui peut considérablement améliorer la robustesse des applications Web et empêcher les attaques malveillantes.
Mécanisme de boucle d'événements
Ce qu'on appelle la boucle d'événements signifie que NodeJS utilisera le mécanisme d'événements pour résoudre toutes les opérations asynchrones. Il existe un thread qui boucle en permanence pour détecter la file d'attente d'événements.
Toute la logique dans NodeJS est une fonction de rappel d'événement, donc NodeJS est toujours dans la boucle d'événements et l'entrée du programme est la fonction de rappel du premier événement de la boucle d'événements. La fonction de rappel d'événement peut émettre une requête d'E/S ou émettre directement l'événement et revenir à la boucle d'événements après l'exécution. La boucle d'événements vérifie la file d'attente des événements pour les événements non gérés jusqu'à la fin du programme. La boucle d'événements de NodeJS est invisible pour les développeurs et est implémentée par la bibliothèque libev. libev vérifie en permanence s'il existe des écouteurs d'événements actifs qui peuvent être détectés et ne quitte pas la boucle d'événements tant qu'aucun écouteur d'événements n'est détecté et que le programme se termine.