Maison > Article > interface Web > La file d'attente d'événements node.js comporte plusieurs étapes
La file d'attente d'événements node.js comporte 6 étapes : 1. étape "timers" ; 2. étape "Rappels d'E/S" ; 3. étape "inactivité, préparation" ; 4. étape "sondage" ; Étape ; 6. étape « fermer les rappels ».
L'environnement d'exploitation de ce tutoriel : système windows7, nodejs version 12.19.0, ordinateur DELL G3.
La file d'attente des événements dans Node est assez différente de celle du navigateur, mais le point commun est que les mécanismes des macro-tâches et des micro-tâches sont les mêmes. L'image ci-dessous montre la classification des macro-tâches et des micro-tâches dans node.
nexttick sera exécuté en premier (la plus haute priorité des micro-tâches) à l'ouverture de chaque événement du nœud.
La file d'attente des événements du nœud peut être divisée en 6 étapes suivantes :
1. Étape des minuteries : Cette étape exécute les rappels du timer (setTimeout, setInterval)
2. Étape des rappels d'E/S : exécute certains. Erreurs d'appel des systèmes, telles que les rappels d'erreurs de communication réseau
3. inactif, phase de préparation : utilisée uniquement en interne par le nœud
4. Phase d'interrogation : obtenez de nouveaux événements d'E/S, le nœud se bloquera ici dans des conditions appropriées
5. étape : exécute le rappel de setImmediate()
6. étape des rappels de fermeture : exécute le rappel de l'événement de fermeture du socket
Concentrons-nous sur les trois étapes des minuteries, de l'interrogation et de la vérification, car la plupart des tâches asynchrones du développement quotidien Tous sont traités dans ces 3 étapes.
phase des timers
timers est la première phase de la boucle d'événements. Node vérifiera s'il y a un timer expiré. S'il y en a, il poussera son rappel dans la file d'attente des tâches du timer pour attendre l'exécution. Node ne peut pas garantir que le minuteur sera exécuté immédiatement lorsque l'heure prédéfinie est atteinte, car la vérification de l'expiration du minuteur par Node n'est pas nécessairement fiable. Elle sera affectée par d'autres programmes en cours d'exécution sur la machine, ou le thread principal n'est pas inactif à ce moment-là. temps. Par exemple, dans le code suivant, l'ordre d'exécution de setTimeout() et setImmediate() est incertain.
setTimeout(() => { console.log('timeout')}, 0)setImmediate(() => { console.log('immediate')})
Le code ci-dessus est un gros piège. Le nœud ne peut pas déterminer l'heure précise à laquelle la file d'attente des événements est établie à chaque fois. Cela peut être de 5 ms cette fois (le timer est poussé sur la pile et ne sera exécuté qu'au deuxième tour), et 1 ms la prochaine fois (minuterie Attrapé et exécuté au premier tour). Par conséquent, l'ordre des résultats de sortie est incertain, ce qui est également la raison spécifique lorsqu'une opération asynchrone est imbriquée et encapsulée, il est garanti à 100 % que l'opération immédiate sera exécutée en premier.
fs.readFile('./index.html',(err,result)=>{ setTimeout(() => { console.log('timeout') }, 0) setImmediate(() => { console.log('immediate') })})
C'est parce que le minuteur n'a pas été capturé au premier tour, il passe donc directement à la phase d'interrogation pour capturer le rappel io Lorsque le io se termine et entre dans la phase de vérification, immédiat sera exécuté et le délai d'attente sera atteint. le début du deuxième tour d'exécution du chronomètre.
phase d'interrogation
la phase d'interrogation a principalement 2 fonctions :
1. Traiter les événements dans la file d'attente d'interrogation
2. Lorsqu'un minuteur a expiré, exécutez sa fonction de rappel
même la boucle exécutera les événements de manière synchrone dans la file d'attente d'interrogation Rappel jusqu'à ce que la file d'attente soit vide ou que le rappel exécuté atteigne la limite supérieure du système (la limite supérieure est inconnue), alors même la boucle vérifiera s'il existe un setImmediate() prédéfini, il y a deux situations :
1. S'il existe un setImmediate() prédéfini, la boucle d'événements mettra fin à la phase d'interrogation et entrera dans la phase de vérification, et exécutera la file d'attente des tâches de la phase de vérification
2. S'il n'y a pas de setImmediate() prédéfini, la boucle d'événements bloquera et attendez dans cette phase
Notez un détail, il n'y a pas de setImmediate() ) qui entraînera le blocage de la boucle d'événements dans la phase d'interrogation, donc le minuteur précédemment défini ne pourra-t-il pas s'exécuter ? Par conséquent, pendant la phase d'interrogation, la boucle d'événements disposera d'un mécanisme de vérification pour vérifier si la file d'attente du minuteur est vide. Si la file d'attente du minuteur n'est pas vide, la boucle d'événements démarrera le tour suivant de la boucle d'événements, c'est-à-dire qu'elle entrera à nouveau. la phase de minuterie.
phase de vérification
Le rappel setImmediate() sera ajouté à la file d'attente de vérification. À partir du diagramme de phase de la boucle d'événements, nous pouvons savoir que l'ordre d'exécution de la phase de vérification est après la phase d'interrogation.
Résumé
nodeIl y a six scènes divisées dans chaque grande boucle d'événement. Chaque scène doit être exécutée dans l'ordre, ce qui est plus détaillé que le navigateur, et sera effectué à chaque étape du traitement de la macro. les tâches et les micro tâches sont un point particulier.
1. La boucle d'événements de Node.js est divisée en 6 étapes
2 Dans les environnements de navigateur et de nœud, le timing d'exécution de la file d'attente des tâches microtâches est différent
Dans Node.js, la microtâche fait partie des différentes étapes. de la boucle d'événement. Du côté du navigateur, la microtâche est exécutée après l'exécution de la macrotâche de la boucle d'événement. 3. L'appel récursif de process.nextTick() entraînera une privation d'E/S. La recommandation officielle est d'utiliser setImmediate(). . Chaque étape d'événement suivante a la priorité la plus élevée parmi les microtâches.
Pour plus de connaissances sur les nœuds, veuillez visiter :
tutoriel Nodejs! !
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!