setTimeout和setImmediate以及process.nextTick的区别

  在javascript中我们了解到了setTimeout和setInterVal函数事件队列(任务队列)的相关知识,除了setTimeout和setInterval这两个方法外,Node.js还提供了另外两个与"任务队列"有关的方法:process.nextTick和setImmediate。它们可以帮助我们加深对"任务队列"的理解。

  setTimeout()

  首先我们看看setTimeout(setInterVal和setTimeout函数区别只是执行次数)函数,需要注意的是,setTimeout()只是将事件插入了"任务队列",必须等到当前代码(执行栈)执行完,主线程才会去执行它指定的回调函数。要是当前代码耗时很长,有可能要等很久,所以并没有办法保证,回调函数一定会在setTimeout()指定的时间执行。

1 setTimeout(function(){console.log(‘0‘)},0);//意思是回调函数加入事件队列的队尾,主线程和事件队列的函数执行完成之后立即执行定时器的回调函数,如果定时器的定时是相同的,就按定时器回调函数的先后顺序来执行。
2 console.log(1);
3 setTimeout(function(){console.log(2);},1000);
4 setTimeout(function(){console.log(4);},1000);
5 console.log(3);
6 //1 3 0 2 4

  setImmediate()

  setImmediate()是将事件插入到事件队列尾部,主线程和事件队列的函数执行完成之后立即执行setImmediate指定的回调函数,和setTimeout(fn,0)的效果差不多,但是当他们同时在同一个事件循环中时,执行顺序是不定的。另外setTimeout和setImmediate也有一定的区别(还在探索...),在实际工作中我们其实她们的区别貌似不明显,请高手指出感激不尽

 1 console.log(‘1‘);
 2
 3 setImmediate(function () {
 4     console.log(‘2‘);
 5 });
 6
 7 setTimeout(function () {
 8    console.log(‘3‘);
 9 },0);
10
11 process.nextTick(function () {
12     console.log(‘4‘);
13 });
14
15 //1 4 2 3也可能是1 4 3 2

  process.nextTick()

  process.nextTick()方法可以在当前"执行栈"的尾部-->下一次Event Loop(主线程读取"任务队列")之前-->触发process指定的回调函数。也就是说,它指定的任务总是发生在所有异步任务之前,当前主线程的末尾。(nextTick虽然也会异步执行,但是不会给其他io事件执行的任何机会)

 1 process.nextTick(function A() {
 2   console.log(1);
 3   process.nextTick(function B(){console.log(2);});
 4 });
 5
 6 setTimeout(function C() {
 7   console.log(3‘);
 8 }, 0)
 9 // 1
10 // 2
11 // 3

当然这样也是一样的:

setTimeout(function C() {
    console.log(3‘);
}, 0)
process.nextTick(function A() {
    console.log(1);
    process.nextTick(function B(){console.log(2);});
});
// 1
// 2
// 3

当然这样还是一样的:

setTimeout(function C() {
    console.log(3‘);
}, 0)
process.nextTick(function A() {
    process.nextTick(function B(){console.log(2);});
    console.log(1);
});
// 1
// 2
// 3

最后process.maxTickDepth()的缺省值是1000,如果超过会报exceed callback stack。官方认为在递归中用process.nextTick会造成饥饿event loop,因为nextTick没有给其他异步事件执行的机会,递归中推荐用setImmediate

foo = function(bar) {
    console.log(bar);
    return process.nextTick(function() {
                return f(bar + 1);
    });
};
setImmediate(function () {
      console.log(‘1001‘);
});
foo(1);//注意这样不会输出1001,当递归执行到1000次是就会报错exceed callback stack,/*
foo = function(bar) {
    console.log(bar);   if(bar>1000){      return;    }
    return process.nextTick(function() {
                return f(bar + 1);
    });
};
setImmediate(function () {
      console.log(‘1001‘);
});
foo(1);*/
时间: 2024-07-30 17:03:57

setTimeout和setImmediate以及process.nextTick的区别的相关文章

setTimeout,setInterval,process.nextTick,setImmediate in Nodejs

Nodejs的特点是事件驱动,异步I/O产生的高并发,产生此特点的引擎是事件循环,事件被分门别类地归到对应的事件观察者上,比如idle观察者,定时器观察者,I/O观察者等等,事件循环每次循环称为Tick,每次Tick按照先后顺序从事件观察者中取出事件进行处理. 调用setTimeout()或setInterval()时创建的计时器会被放入定时器观察者内部的红黑树中,每次Tick时,会从该红黑树中检查定时器是否超过定时时间,超过的话,就立即执行对应的回调函数.setTimeout()和setInt

Node.js学习笔记:setImmediate与process.nextTick

通过process.nextTick注册的函数在当前这个事件循环中执行的函数执行完毕后立即执行,相当于把当前的同步代码执行完毕之后,立刻执行所有的通过process.nextTick注册的函数,如果注册的是多个,那么注册的函数会依次按顺序执行完毕:通过setImmediate注册的函数在下一个事件循环中执行,如果有多个,那么回依次执行. 1 'use strict'; 2 const process=require('process'); 3 4 process.nextTick(functio

解读setTimeout,promise.then,process.nextTick,setImmediate的执行顺序

最近在看<Node.js调试指南>的时候遇到有意思的几道题,是关于setTimeout, promise.then, process.nextTick, setImmediate的执行顺序.今天抽空记录下这道题的分析过程及背后的原理与知识点. 题目如下: // 题目一: setTimeout(()=>{ console.log('setTimeout') },0) setImmediate(()=>{ console.log('setImmediate') }) // 题目二: c

process.nextTick,Promise.then,setTimeout,setImmediate执行顺序

1. 同步代码执行顺序优先级高于异步代码执行顺序优先级: 2. new Promise(fn)中的fn是同步执行: 3. process.nextTick()>Promise.then()>setTimeout>setImmediate 出处:https://www.jb51.net/article/151174.htm 原文地址:https://www.cnblogs.com/mengff/p/10216494.html

比较setImmediate(func),setTimeout(func),process.nextTick(func)

node中的事件优先级机制: console.log('第一笔!'); process.nextTick(function() { console.log('吃个饭吧!'); setImmediata(function() { console.log('洗个头发1!'); }); }); setImmediata(function() { console.log('洗个头发2!'); }); console.log('第二笔!'); console.log('第三笔!'); 那么执行的步骤就是

node中定时器, process.nextTick(), setImediate()的区别与联系

1.定时器 setTimeout()和setInterval()与浏览器中的API是一致的,定时器的问题在于,他并非精确的(在容忍范围内).尽管事件循环十分快,但是如果某一次循环占用的时间较多,那么下次循环时,他也许已经超时很久了.比如通过setTimeout()设定一个任务在10毫秒后执行,但是在9毫秒后,有一个任务占用了5毫秒的cpu时间片,再次轮到定时器执行时,时间就已经过期4毫秒. 2.process.nextTick() 在未了解process.nextTick()之前,很多人也许为了

setImmediate vs. nextTick的区别

参考:http://stackoverflow.com/questions/15349733/setimmediate-vs-nexttick setImmediate 在已在事件队列的I/O事件触发之后发生,process.nextTick在事件队列之前,并且在当前函数结束之后发生. 因此,如果你打算打断长运行.使用递归的cpu任务,你可以使用setImmediate 而非process.nextTick来插入下一个迭代,否则任何I/O事件回调没有任何机会在迭代过程中被调用. 另外: 传递到p

【ask】Recursive process.nextTick detected. This will break in the next version of node. Please use setImmediate for recursive deferral.

1.周五对nodejs tcp长连接服务器框架进行压测,一切开始比较常规(没什么特殊问题). 2.突然手一哆嗦,把压测用的客户端群一起关闭了. 3.这个时候nodejs的服务器爆出了"Caught exception: Error: read ECONNRESET". 4.这个以前做linux服务器时候见过(忽略掉SIGPIPE信号,nodejs默认也是这么做的),没有太在意. 5.但是紧接着标题里的错误出现了,一看这个我感觉肯定不是自己直接调用的原因. 6.心想先写一个最简单的服务器

js的事件循环机制:同步与异步任务(setTimeout,setInterval)宏任务,微任务(Promise,process.nextTick)

javascript是单线程,一切javascript版的"多线程"都是用单线程模拟出来的,通过事件循环(event loop)实现的异步. javascript事件循环 事件循环中的同步任务,异步任务: 同步和异步任务在不同的执行"场所",同步的进入主线程,异步的进入Event Table执行并注册函数. 当指定的异步事情完成时,Event Table会将这个函数移入Event Queue. 主线程内的任务执行完毕为空,会去Event Queue读取对应的函数,推