Maison  >  Article  >  interface Web  >  Résumé des E/S non bloquantes et de la boucle d'événements dans Node.js_node.js

Résumé des E/S non bloquantes et de la boucle d'événements dans Node.js_node.js

WBOY
WBOYoriginal
2016-05-16 16:36:121287parcourir

Cela fait deux mois que j'ai appris et utilisé Node.js. J'ai utilisé Express combiné avec Mongoose pour écrire une application Web et un ensemble d'API Web RESTful. Retour sur l'introduction de Node.js sur la page d'accueil du. Site officiel de Node.js : Node.js utilise un modèle d'E/S non bloquant et piloté par des événements qui le rend léger et efficace. Alors, que signifie le modèle d'E/S non bloquant ?

Modèle IO non bloquant

Tout d'abord, les opérations d'E/S prennent sans aucun doute du temps. Lorsque le serveur reçoit un grand nombre de requêtes, la création d'un processus ou d'un thread pour chaque requête ajoute également une surcharge de mémoire supplémentaire et peut gaspiller plus de temps.

Étant donné que Node.js est piloté par les événements, il utilise une boucle d'événements pour résoudre le problème de goulot d'étranglement causé par les opérations d'E/S. Dans Node.js, une opération IO a généralement une fonction de rappel. Lorsque l'opération IO est terminée et revient, la fonction de rappel sera appelée et le thread principal continuera à exécuter le code suivant. Utilisons simplement un exemple pour illustrer ce problème :

request('http://www.google.com', function(error, response, body) {
   console.log(body);
});
 
console.log('Done!');

La signification de ce code est de faire une requête à « http://www.google.com ». Lorsque la requête revient, la fonction de rappel est appelée pour afficher les informations de réponse. En raison du mécanisme de fonctionnement de Node.js, une fois ce code exécuté, « Terminé ! » sera immédiatement affiché sur la console, puis les informations de réponse seront affichées après un certain temps.

Boucle d'événement boucle d'événement

Ensuite, discutons du mécanisme de la boucle d'événements. Parlons d’abord de l’appel de 桟. Par exemple, il y a le morceau de code suivant :

.
function A(arg, func){
  var a = arg;
 
  func();
  console.log('A');  
}
 
function B(){
  console.log('B');
}
 
A(0, B);

Lorsque le code est exécuté, la fonction A est d'abord poussée dans le compartiment appelant pour devenir l'élément supérieur de la pile et commence à exécuter A. Pendant le processus d'exécution, la fonction B est poussée dans le compartiment appelant pour devenir l'élément supérieur de la pile. Une fois l'exécution de B terminée, B Après avoir été retiré de la pile appelante, A redevient l'élément supérieur de la pile. Une fois l'exécution de A terminée, A est sorti de la pile appelante et le. la pile appelante devient inactive.

Il existe une file d'attente de messages dans le runtime Javascript et le message est associé à une fonction de rappel. Lorsqu'un événement est déclenché, si l'événement a une fonction de rappel correspondante, le message sera ajouté à la file d'attente des messages.

En regardant exactement sur quoi tourne la boucle d'événement, une fois le code commencé à s'exécuter, les fonctions sont continuellement poussées dans le compartiment appelant. Prenez l'exemple ci-dessus, la requête est poussée dans le compartiment appelant et cette fonction sera exécutée. request (cette requête http sera implémentée par le module sous-jacent de Node.js). Dans le même temps, l'événement d'achèvement de la requête est associé à une fonction de rappel. La requête est extraite de la pile appelante et console.log est. poussé dans la pile appelante pour démarrer l’exécution. Lorsque la demande est terminée, l'événement d'achèvement est déclenché et un message est ajouté à la file d'attente des messages. La file d'attente des messages vérifiera d'abord si le stacker appelant est inactif. Si le stacker appelant n'est pas inactif, il attendra que le stacker appelant soit inactif. inactif, puis le début de la file d'attente des messages apparaît et la fonction de rappel associée au message est exécutée.

Résumé

Ce qui précède est un résumé conceptuel du modèle non bloquant et de la boucle d'événements. Ce mécanisme de boucle d'événements n'est pas unique à Node.js, et le code de Node.js est exécuté dans un seul thread. Quels avantages présente-t-il face à un grand nombre de requêtes simultanées ?

L'image ci-dessus montre le schéma d'architecture de Node.js. Il y a un module au bas de Node.js qui est responsable de la maintenance du pool de threads. Lorsqu'une requête IO est émise, le module inférieur de Node.js le fera. créez un nouveau thread pour traiter la demande, puis renvoyez les résultats à la couche supérieure une fois terminé. Ensuite, lorsqu'il y a plusieurs requêtes, le module sous-jacent de Node.js utilisera le moins de threads possible pour effectuer le plus de tâches. S'il y a des threads inactifs, il continuera à être utilisé pour faire d'autres choses, c'est ce que j'ai dit. plus tôt En termes d’ouverture d’un nouveau processus ou fil pour chaque demande, c’est sans aucun doute beaucoup plus « intelligent » et plus efficace.

Cet article est un résumé de l'apprentissage de Node.js. S'il y a des problèmes ou des lacunes, n'hésitez pas à me critiquer et à me corriger.

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