nextTick vs setImmediate, explication visuelle
Je suis très confus sur les différences entre les nextTick et setImmediate. J'ai lu toute la documentation à leur sujet sur internet mais je ne comprends toujours pas comment ils fonctionnent.
Exemples:
function log(n) { console.log(n); }
setImmediate
setImmediate(function() {
setImmediate(function() {
log(1);
setImmediate(function() { log(2); });
setImmediate(function() { log(3); });
});
setImmediate(function() {
log(4);
setImmediate(function() { log(5); });
setImmediate(function() { log(6); });
});
});
//1 2 3 4 5 6
nextTick
process.nextTick(function() {
process.nextTick(function() {
log(1);
process.nextTick(function() { log(2); });
process.nextTick(function() { log(3); });
});
process.nextTick(function() {
log(4);
process.nextTick(function() { log(5); });
process.nextTick(function() { log(6); });
});
});
//1 4 2 3 5 6
Pourquoi ces résultats? Veuillez expliquer avec un visuel ou très facile de suivre les explications. Même le nœud de base devs ne sont pas d'accord sur la façon dont nextTick et setImmediate doit être compris par les gens.
Sources:
- setImmediate vs nextTick
- Pourquoi est-setImmediate beaucoup plus lente que nextTick?
- setImmediate n'est pas toujours très immédiat
- Grande question. C'est une excellente façon d'illustrer les différences.
- Le résultat est le même (
1 4 2 3 5 6
) pour les deux exécutions (Nœud v5.6.0) - Sage et d'aider à la question!
- à la fois produit de la même sortie
- Regardez l'année, il y a 5 ans! Beaucoup de choses ont changé.
Vous devez vous connecter pour publier un commentaire.
Considérons les deux exemples suivants:
setImmediate
nextTick
setImmediate rappels sont tirés hors de la boucle d'événements, une fois par itération dans l'ordre où ils ont été mis en file d'attente. Donc, à la première itération de la boucle d'événements, Un rappel est envoyé. Puis sur la deuxième itération de la boucle d'événements, de rappel B est déclenché, puis sur la troisième itération de la boucle d'événement de rappel C est tiré, etc. Cela empêche la boucle d'événement de blocage et permet à d'autres d'e/S ou de rappels de la minuterie d'être appelé dans le temps (comme c'est le cas de l'0ms expiration, qui est tiré sur la 1ère ou la 2ème itération de boucle).
nextTick rappels, cependant, sont toujours déclenché immédiatement après le code actuel est effectuée en cours d'exécution et AVANT de retourner à la boucle d'événements. Dans le nextTick exemple, nous nous retrouvons de l'exécution de toutes les nextTick rappels avant de revenir à la boucle d'événements. Depuis setTimeout du callback sera appelée à partir de la boucle d'événements, le message "DÉLAI d'attente FLAMME" ne sera pas de sortie jusqu'à ce que nous en avons terminé avec tous les nextTick de rappel.
TIMEOUT FIRED 1 4 2 3 5 6
setImmediate
je pense que B et C sont poussés àcheck queue
dans la même itération parce que le JS estrun to complete
Selon l'Node.js doc noms de ces deux fonction sont exactement inversés
setImmediate() (RECOMMANDÉ de)
C'est le premier feu à la file d'attente d'événements
processus.nextTick() (UTILISER POUR des CAS particuliers, voir l'exemple plus tard)
C'est le feu, C'est un peu écrire une déclaration de plus à la fin du fichier en cours
Si nous avons ce code
Une explication visuelle selon votre demande:
Cas pour le processus d'utilisation.nextTick() lorsque vous avez à émettre et le cas avant pour la gérer:
Regarder ce vide où Philippe Roberts nous donner une bonne explication à propos d'exécution boucle d'événement et de regarder cela en ligne eventloop débogueur Test en direct comment la boucle d'événement de travaux
Source:
https://github.com/nodejs/node/blob/master/doc/topics/the-event-loop-timers-and-nexttick.md#processnexttick-vs-setimmediate
Je ne peux pas reproduire vos résultats pour
setImmediate
. Il doit être le même quenextTick
(et il est dans mes tests), car dans cette situation, ils font à peu près la même chose. La seule explication raisonnable est que lessetImmediate
est d'une certaine manière synchrone, mais il ne l'est pas.Et selon NodeJS documentation la seule vraie différence est le fait que plusieurs
nextTick
feu dans une boucle d'itération (selonmaxTickDepth
), tandis quesetImmediate
feux une fois par itération.Ci-dessous vous donne une meilleure clarté.
setImmediate
require
.nextTick
Simple Extrait de code.
Je pense que toutes les réponses ci-dessus sont obsolètes, parce que j'ai eu des réponses différentes en permanence avec la version actuelle de nodejs et il est facile de raisonner sur
Après la lecture de https://github.com/nodejs/node/blob/master/doc/topics/the-event-loop-timers-and-nexttick.md#processnexttick-vs-setimmediate
laissez démarrer utiliser de
setImmediate
nous devrions garder une trace de lacheck queue
car c'est là que lesetImmediate
rappel résident.Première itération
A
est de pousser àcheck queue
file d'attente de vérification :[A]
Deuxième itération
A
est de sortir dequeue
pour exécuterAu cours de son exécution ,il a mis
B
etE
àqueue
et puis,A
complet et commencer la prochaine itérationfile d'attente de vérification :[B,E]
Troisième itération
sortir
B
et pousserC
D
file d'attente de vérification :[E,C,D]
De suite itération
sortir
E
et pousserF
G
file d'attente de vérification : [C,D,F,G]
Enfin
exécuter les rappels dans la file d'attente de manière séquentielle
Pour
nextTick
cas, la file d'attente fonctionne exactement de la même manière,c'est pourquoi il produire le même résultatLa différence est que :
Pour être clair,la boucle d'événement de maintenir de multiples files d'attente et
check queue
est juste l'un d'eux,le nœud décidera de la file d'attente à utiliser en fonction de certaines règlesavec
process.nextTick
cependant,il est une sorte de contournement de la tous la règle et exécuter le rappel dansnextTick
immédiatement