J'apprends et utilise Node.js depuis deux mois. J'ai utilisé Express et combiné avec Mongoose pour écrire une application Web et un ensemble d'API Web RESTful. En regardant en arrière 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 bloquante axé sur les é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 IO prennent sans aucun doute du temps. Lorsque le serveur reçoit un grand nombre de demandes, la création d'un processus ou d'un thread pour chaque demande ajoute également des frais généraux de mémoire et peut perdre plus de temps et de ressources.
Étant donné que Node.js est axé sur les événements, il utilise des boucles d'événements pour résoudre les problèmes de goulot d'étranglement causés par les opérations IO. Dans Node.js, une opération IO a généralement une fonction de rappel. Lorsque l'opération IO se termine et revient, la fonction de rappel sera appelée et le thread principal continue d'exécuter le code suivant. Illustrons brièvement ce problème avec un exemple:
request ('http://www.google.com', fonction (erreur, réponse, corps) {console.log (body);}); console.log («Done!»);Ce code signifie émettre une demande à «http://www.google.com», et lorsque la demande renvoie cette fonction de rappel, les informations de réponse sont sorties. En raison du mécanisme d'exécution de Node.js, une fois ce code exécuté, il sortira immédiatement «Terminé! sur la console, puis sur les informations de réponse après une période de temps.
Boucle de boucle d'événement
Ensuite, discutons du mécanisme de la boucle d'événements. Tout d'abord, parlons de l'appel, par exemple, il y a le code suivant:
fonction a (arg, func) {var a = arg; func (); console.log ('a'); } fonction b () {console.log ('b');} a (0, b);Une fois le code exécuté, la fonction A est d'abord poussée dans l'appel et devient 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 l'appel et devient l'élément supérieur de la pile. Une fois que B a été exécuté, B est apparu et appelé, et A redevient l'élément supérieur de la pile. Une fois A Exécuté, A est apparu et appelé, et l'appel est inactif.
Il y a une file d'attente de messages dans l'exécution JavaScript, et le message est associé à une fonction de rappel. Lorsqu'un événement est déclenché, si l'événement dispose d'une fonction de rappel correspondante, le message sera ajouté à la file d'attente de messages.
Parlons de la boucle de l'événement. Une fois que le code a commencé à s'exécuter, la fonction est constamment poussée dans l'appel. Prenez l'exemple ci-dessus. La demande est poussée dans l'appel, et cette fonction fera une demande HTTP (cette demande HTTP sera remise au module sous-jacent de Node.js) et l'événement terminé en même temps est associé à une fonction de rappel. La demande est apparue et appelée, et Console.log est poussé dans l'appel pour démarrer l'exécution. Une fois la demande terminée, l'événement d'achèvement est déclenché et un message est ajouté à la file d'attente de messages. La file d'attente de messages vérifie d'abord si l'appel est inactif. Si l'appel n'est pas inactif, il attendra que l'appel soit inactif et apparaîtra la tête de la file d'attente de messages. À l'heure actuelle, 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 et de la boucle d'événements non bloquants. Le mécanisme de cette boucle d'événements n'est pas seulement unique à Node.js, et le code de Node.js est exécuté par un seul thread. Quels sont les avantages lorsqu'ils sont confrontés à un grand nombre de demandes simultanées?
L'image ci-dessus montre le schéma d'architecture de Node.js. Il y a un module dans la couche sous-jacente de Node.js est responsable du maintien du pool de threads. Lorsqu'une demande IO est émise, la couche sous-jacente de Node.js créera un nouveau thread pour traiter la demande, puis renvoie le résultat à la couche supérieure après l'achèvement. Ensuite, lorsqu'il y a plusieurs demandes, 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 fils gratuits, il continuera d'être utilisé pour faire d'autres choses. Ceci est sans aucun doute beaucoup plus intelligent et plus efficace pour l'ouverture d'un nouveau processus ou d'un nouveau fil pour chaque demande comme mentionné précédemment.
Cet article est un résumé de l'apprentissage Node.js. S'il y a des problèmes ou des lacunes, les critiques et la correction sont les bienvenues.