La versión 0.10 de Node.js se lanzó hoy y se presentó setImmediate
. La documentación de cambios de API sugiere su uso al hacer nextTick
llamadas recursivas .
Por lo que dice MDN , parece muy similar a process.nextTick
.
¿Cuándo debo usar nextTick
y cuándo debo usar setImmediate
?
javascript
node.js
setimmediate
Benjamin Gruenbaum
fuente
fuente
nextTick
es más rápido quesetImmediate
en grandes cálculos.setImmediate
hace con mayor detalle.setImmediate
, pero no antesnextTick
?Respuestas:
Úselo
setImmediate
si desea poner en cola la función detrás de las devoluciones de llamadas de eventos de E / S que ya están en la cola de eventos. Utilíceloprocess.nextTick
para poner en cola efectivamente la función en la cabecera de la cola de eventos para que se ejecute inmediatamente después de que se complete la función actual.Por lo tanto, en un caso en el que intente romper un trabajo de larga duración vinculado a la CPU utilizando la recursividad, ahora querrá usar en
setImmediate
lugar deprocess.nextTick
poner en cola la próxima iteración, de lo contrario, cualquier devolución de llamada de eventos de E / S no tendría la oportunidad correr entre iteraciones.fuente
requestAnimationFrame
porque no siempre ocurre (definitivamente he visto esto, creo que el ejemplo era la pestaña no era la pestaña actual) y se puede llamar antes de que la página haya completado la pintura (es decir, el navegador todavía está ocupado dibujando).Como una ilustracion
dará el siguiente resultado
Espero que esto pueda ayudar a entender la diferencia.
Actualizado:
fuente
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:
Entonces, esta respuesta realmente no responde a la diferencia exacta, sino simplemente un ejemplo que podría variar en un contexto diferenteCreo que puedo ilustrar esto bastante bien. Como
nextTick
se llama al final de la operación actual, llamarla de forma recursiva puede terminar bloqueando la continuación del bucle de eventos.setImmediate
resuelve esto disparando en la fase de verificación del bucle de eventos, permitiendo que el bucle de eventos continúe normalmente.fuente: https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/
Observe que la fase de verificación es inmediatamente posterior a la fase de sondeo. Esto se debe a que la fase de sondeo y las devoluciones de llamadas de E / S son los lugares más probables en los que
setImmediate
se ejecutarán sus llamadas . Así que, idealmente, la mayoría de esas llamadas serán bastante inmediatas, pero no tan inmediatas como lasnextTick
que se verifican después de cada operación y técnicamente existen fuera del bucle de eventos.Echemos un vistazo a un pequeño ejemplo de la diferencia entre
setImmediate
yprocess.nextTick
:Digamos que acabamos de ejecutar este programa y estamos pasando por la primera iteración del bucle de eventos. Llamará a la
step
función con la iteración cero. Luego registrará dos controladores, uno parasetImmediate
y otro paraprocess.nextTick
. Luego llamamos recursivamente a esta función desde elsetImmediate
controlador que se ejecutará en la siguiente fase de verificación. ElnextTick
controlador se ejecutará al final de la operación actual interrumpiendo el bucle de eventos, por lo que, aunque se registró en segundo lugar, se ejecutará primero.El orden termina siendo:
nextTick
dispara a medida que finaliza la operación actual, comienza el siguiente bucle de eventos, se ejecutan las fases normales del bucle de eventos, sesetImmediate
dispara y recursivamente llama a nuestrastep
función para comenzar el proceso nuevamente. Finaliza la operación actual,nextTick
incendios, etc.La salida del código anterior sería:
Ahora pasemos nuestra llamada recursiva a
step
nuestronextTick
controlador en lugar delsetImmediate
.Ahora que se ha pasado la llamada recursiva a
step
en lasnextTick
cosas del manejador se comportará en un orden diferente. Nuestra primera iteración del bucle de eventos se ejecuta y llama alstep
registro de unsetImmedaite
controlador y unnextTick
controlador. Después de que finaliza la operación actual, nuestronextTick
controlador se activastep
y llama y registra recursivamente a otrosetImmediate
controlador, así como a otronextTick
controlador. Dado que unnextTick
controlador se dispara después de la operación actual, registrar unnextTick
controlador dentro de unnextTick
controlador hará que el segundo controlador se ejecute inmediatamente después de que finalice la operación del controlador actual. LosnextTick
controladores seguirán disparando, evitando que el ciclo de eventos actual continúe. Vamos a superar todos nuestrosnextTick
manejadores antes de que veamos un solosetImmediate
manejo de fuego.La salida del código anterior termina siendo:
Tenga en cuenta que si no hubiéramos interrumpido la llamada recursiva y la hubiéramos abortado después de 10 iteraciones, las
nextTick
llamadas seguirían recurriendo y nunca dejarían que el bucle de eventos continuara a la siguiente fase. Así es comonextTick
puede convertirse en bloqueo cuando se usa de forma recursiva, mientras quesetImmediate
se disparará en el próximo ciclo de eventos y establecer otrosetImmediate
controlador desde dentro no interrumpirá en absoluto el ciclo de eventos actual, lo que le permitirá continuar ejecutando fases del ciclo de eventos de manera normal.¡Espero que ayude!
PD: estoy de acuerdo con otros comentaristas en que los nombres de las dos funciones podrían intercambiarse fácilmente, ya que
nextTick
parece que se activará en el siguiente bucle de eventos en lugar del final del actual, y el final del bucle actual es más "inmediato" "que el comienzo del siguiente ciclo. Bueno, eso es lo que obtenemos a medida que una API madura y la gente depende de las interfaces existentes.fuente
En los comentarios en la respuesta, no indica explícitamente que nextTick cambió de Macrosemantics a Microsemantics.
antes del nodo 0.9 (cuando se introdujo setImmediate), nextTick funcionó al comienzo de la siguiente pila de llamadas.
desde el nodo 0.9, nextTick funciona al final de la pila de llamadas existente, mientras que setImmediate está al comienzo de la siguiente pila de llamadas
echa un vistazo a https://github.com/YuzuJS/setImmediate para obtener herramientas y detalles
fuente
En términos simples, process.NextTick () se ejecutaría en el siguiente tic del bucle de eventos. Sin embargo, setImmediate, básicamente, tiene una fase separada que garantiza que la devolución de llamada registrada bajo setImmediate () se invoque solo después de la fase de devolución de llamada y sondeo de E / S.
Consulte este enlace para obtener una buena explicación: https://medium.com/the-node-js-collection/what-you-should-know-to-really-understand-the-node-js-event-loop-and -its-metrics-c4907b19da4c
fuente
Aquí hay algunas respuestas excelentes que detallan cómo funcionan ambas.
Simplemente agregue uno que responda a la pregunta específica que se hace:
Siempre uso
setImmediate
.El Node.js Event Loop, Timers y
process.nextTick()
doc incluyen lo siguiente:Anteriormente en el documento advierte que
process.nextTick
puede conducir a ...Como resultado,
process.nextTick
incluso puede morir de hambrePromises
:Por otro lado,
setImmediate
es " más fácil razonar " y evita este tipo de problemas:Por lo tanto, a menos que exista una necesidad específica del comportamiento único de
process.nextTick
, el enfoque recomendado es " utilizarlosetImmediate()
en todos los casos ".fuente
Le recomiendo que consulte la sección de documentos dedicada a Loop para obtener una mejor comprensión. Algunos fragmentos tomados de allí:
Tenemos dos llamadas que son similares en lo que respecta a los usuarios, pero sus nombres son confusos.
process.nextTick () se dispara inmediatamente en la misma fase
setImmediate () se activa en la siguiente iteración o 'tic' del
bucle de eventos
En esencia, los nombres deben intercambiarse. process.nextTick () se dispara más inmediatamente que setImmediate (), pero este es un artefacto del pasado que es poco probable que cambie.
fuente