setImmediate vs nextTick
Node.js la version 0.10 a été publié aujourd'hui et introduit setImmediate
. Le Les changements de l'API la documentation suggère de l'utiliser pour faire récursive nextTick
appels.
De ce MDN dit il semble très similaire à process.nextTick
.
Quand dois-je utiliser nextTick
et quand dois-je utiliser setImmediate
?
- Il y a 5 paragraphes au sujet de ce changement sur le blog blog.nodejs.org/2013/03/11/node-v0-10-0-stable
- À partir de tests de performances, il ressemble à
nextTick
est plus rapide quesetImmediate
sur de grands calculs. - Pour l'anecdote, j'ai lu ces cinq paragraphes premier et toujours fini sur cette question quand elle n'a pas vraiment clair rien pour moi. L'on a accepté la réponse est beaucoup plus concis et décrit réellement ce que
setImmediate
ne plus de détails. - J'ai expliqué la différence en détail dans mon blog.
- Est-ce que le GC peut s'exécuter avant
setImmediate
, mais pas avantnextTick
? - C'est une question distincte, mais non - GC pouvez exécuter chaque fois qu'GC veut exécuter. Il est vrai que setImmediate donne GC a plus la possibilité de courir sur une meilleure portée (un événement externe), mais le Nœud n'a pas de pause manuellement GC pour un autre code. Vous pouvez toujours exécuter le GC-vous avec --exposer-gc par la ou les oligo-GCs et de voir 🙂
Vous devez vous connecter pour publier un commentaire.
Utilisation
setImmediate
si vous voulez la file d'attente de la fonction derrière tout ce I/O rappels d'événements qui sont déjà dans la file d'attente des événements. Utilisationprocess.nextTick
efficacement la file d'attente de la fonction à la tête de la file d'attente d'événements, de sorte qu'il s'exécute immédiatement après la fonction en cours est terminée.Donc, dans le cas où vous essayez de briser une longue course, le CPU de l'emploi à l'aide de la récursivité, vous souhaitez désormais utiliser
setImmediate
plutôt queprocess.nextTick
à la file d'attente de la prochaine itération que sinon, n'importe quel événement I/O rappels n'aurais pas la chance de courir entre les itérations.nextTick
va maintenant lancer un avertissement si il pense qu'il est utilisé de façon inappropriée (essayez de le diviser en récursivité dans et vous verrez!)requestAnimationFrame
parce qu'il ne se produit pas toujours (j'ai certainement vu cela, je pense que l'exemple a été onglet n'était pas de l'onglet en cours) et il peut être appelé avant que la page a terminé la peinture (c'est à dire le navigateur est toujours occupé de dessin).window.setImmediate = window.setImmediate || function(fn){ setTimeout(fn, 10); };
requestAnimationFrame
est un hack et IE ne semble pas être en mesure de gérer beaucoup derequestAnimationFrame
exploitation à la fois (Chrome et Firefox ne semblent pas souffrir de problèmes)setImmediate
quitte le domaine active,process.nextTick
ne le fait pas. Je suis pleinement conscient que le nœud domaines sont "obsolètes" (et presque comique, c'est ainsi).Comme une illustration
donnera le résultat suivant
J'espère que cela peut aider à comprendre la différence.
For example, if we run the following script which is not within an I/O cycle (i.e. the main module), the order in which the two timers are executed is non-deterministic, as it is bound by the performance of the process:
Donc, cette réponse n'a pas vraiment répondre à la différence exacte, mais simplement un exemple qui pourrait varier selon le contexteJe pense que je peut illustrer cela tout à fait bien. Depuis
nextTick
est appelé à la fin de l'opération en cours, en l'appelant récursivement peut finir par bloquer la boucle d'événement de continuer.setImmediate
résout ce problème en tirant dans la phase de vérification de la boucle d'événements, permettant la boucle d'événement de continuer normalement.source: https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/
Avis que la phase de vérification est immédiatement après le sondage la phase. C'est parce que le sondage la phase d'e/S et les rappels sont les plus susceptibles des lieux de vos appels à
setImmediate
allez courir. Idéalement, la plupart de ces appels seront effectivement assez immédiate, n'est pas aussi immédiat quenextTick
qui est vérifiée après chaque opération, et techniquement existe en dehors de la boucle d'événements.Prenons un coup d'oeil à un petit exemple de la différence entre
setImmediate
etprocess.nextTick
:Disons-nous juste couru ce programme et avancerez dans la première itération de la boucle d'événements. Il va appeler dans le
step
fonction à l'itération zéro. Il enregistre alors deux fonctions, une poursetImmediate
et un pourprocess.nextTick
. Nous avons ensuite récursivement appeler cette fonction à partir de lasetImmediate
gestionnaire qui sera exécuté dans la prochaine phase de vérification. LenextTick
gestionnaire d'exécuter à la fin de l'opération en cours d'interrompre la boucle d'événements, de sorte que même si elle a été enregistrée en deuxième, il sera effectivement exécuté en premier.L'ordre finit par être:
nextTick
feux comme l'opération en cours se termine, à côté de l'événement de la boucle commence, normal de la boucle d'événement de phases d'exécution,setImmediate
incendies et appelle de manière récursive notrestep
fonction pour commencer le processus une fois de plus. Opération en cours se termine,nextTick
feux, etc.La sortie du code ci-dessus serait:
Maintenant, nous allons passer notre appel récursif à
step
dans notrenextTick
gestionnaire de la place de lasetImmediate
.Maintenant que nous sommes passés de l'appel récursif de
step
dans lenextTick
gestionnaire choses vont se comporter dans un ordre différent. Notre première itération de la boucle d'événement de courses et les appelsstep
l'enregistrement d'unsetImmedaite
gestionnaire ainsi que d'unnextTick
gestionnaire. Après l'opération en cours se termine notrenextTick
gestionnaire d'incendies, qui appelle de manière récursivestep
et enregistre une autresetImmediate
gestionnaire ainsi qu'un autrenextTick
gestionnaire. Depuis unnextTick
gestionnaire d'incendies après l'opération en cours, l'enregistrement d'unnextTick
de gestionnaire au sein d'unenextTick
gestionnaire sera la cause de la deuxième gestionnaire d'exécuter immédiatement après l'actuel gestionnaire opération se termine. LenextTick
gestionnaires va continuer à tirer, la prévention de l'événement courant en boucle continue. Nous allons passer à travers tous nosnextTick
gestionnaires avant de nous voir une seulesetImmediate
gestionnaire d'incendie.La sortie du code ci-dessus, finit par être:
Noter que si on l'avait pas interrompu l'appel récursif et abandonnée après 10 itérations puis le
nextTick
appels garder recursing et de ne jamais laisser la boucle d'événement de continuer à la prochaine phase. C'est de cette façonnextTick
peuvent devenir de blocage lorsqu'elle est utilisée de manière récursive alors quesetImmediate
le feu dans la prochaine boucle d'événement et de fixer une autresetImmediate
gestionnaire de l'intérieur d'une de ne pas interrompre le courant de boucle d'événements, ce qui permet de continuer à exécuter les phases de la boucle d'événements comme normal.Espère que ça aide!
PS - je suis d'accord avec les autres commentateurs, les noms de ces deux fonctions pourraient facilement être échangé depuis
nextTick
l'impression que ça va pour mettre le feu dans la prochaine boucle d'événement plutôt qu'à la fin de celui en cours, et à la fin de la boucle de courant est plus "immédiat" que le début de la boucle suivante. Eh bien, c'est ce que nous obtenons comme une API évolue et que les gens viennent à dépendre des interfaces existantes.Dans les commentaires dans la réponse, il n'est pas dit explicitement que nextTick décalé de Macrosemantics à Microsemantics.
avant que le nœud de 0,9 (quand setImmediate a été introduit), nextTick exploité au début de la prochaine pile des appels.
depuis le nœud de 0,9, nextTick opère à la fin de la pile des appels, alors que setImmediate est au début de la prochaine pile des appels
découvrez https://github.com/YuzuJS/setImmediate pour les outils et les détails
En termes simples, le processus.NextTick() serait exécuté à la prochaine case de boucle d'événements. Cependant, la setImmediate, a essentiellement une phase distincte qui assure que le rappel enregistré sous setImmediate() sera appelée qu'après les IO de rappel et le sondage la phase.
Veuillez consulter ce lien pour belle explication:
https://medium.com/the-node-js-collection/what-you-should-know-to-really-understand-the-node-js-event-loop-and-its-metrics-c4907b19da4c
Quelques grandes réponses ici détaillant la façon dont ils travaillent tous les deux.
Simplement l'ajout d'un seul qui répond à la question posée:
Toujours utiliser
setImmediate
.La Node.js Boucle d'Événements, des Minuteries, et
processus.nextTick()
doc comprend les éléments suivants:Plus tôt dans la doc il avertit que
process.nextTick
peut conduire à...Comme il s'avère,
process.nextTick
peut même mourir de faimPromises
:D'autre part,
setImmediate
est "plus facile de raisonner sur" et évite de ces types de problèmes:Donc, sauf si il y a un besoin spécifique pour le comportement unique de
process.nextTick
, l'approche recommandée consiste à "utilisationsetImmediate()
dans tous les cas".Je vous recommande de vérifier docs section dédiée Boucle for pour obtenir une meilleure compréhension. Quelques extrait à partir de là:
Nous avons deux appels qui sont similaires en ce qui concerne les utilisateurs, mais leurs noms sont source de confusion.
processus.nextTick() se déclenche immédiatement sur la même phase
setImmediate() déclenche l'itération suivante ou "tick" de l'
boucle d'événement de
En essence, les noms doivent être inversés. processus.nextTick() feux plus immédiatement que setImmediate(), mais c'est un artefact du passé qui est peu susceptible de changer.