美文网首页
任务队列之nodejs中的process.nextTick和se

任务队列之nodejs中的process.nextTick和se

作者: 我叫傻先生 | 来源:发表于2017-09-21 20:19 被阅读0次

原文:http://www.ruanyifeng.com/blog/2014/10/event-loop.html

process.nextTick:是当执行栈的任务做完了后,将要进行下一次Event Loop(主线程读取"任务队列")之前,例如:

process.nextTick(function A() {
  console.log(1);
  process.nextTick(function B(){console.log(2);});
});
setTimeout(function timeout() {
  console.log('TIMEOUT FIRED');
}, 0)
// 1
// 2
// TIMEOUT FIRED

由于process.nextTick方法指定的回调函数,总是在当前"执行栈"的尾部触发,所以不仅函数A比setTimeout指定的回调函数timeout先执行,而且函数B也比timeout先执行。这说明,如果有多个process.nextTick语句(不管它们是否嵌套),将全部在当前"执行栈"执行
setImmediate:是setImmediate方法则是在当前"任务队列"的尾部添加事件,也就是说,它指定的任务总是在下一次Event Loop时执行

setImmediate(function A() {
  console.log(1);
  setImmediate(function B(){console.log(2);});
});
setTimeout(function timeout() {
  console.log('TIMEOUT FIRED');
}, 0);

哪个回调函数先执行呢?答案是不确定。运行结果可能是1--TIMEOUT FIRED--2,也可能是TIMEOUT FIRED--1--2。
令人困惑的是,Node.js文档中称,setImmediate指定的回调函数,总是排在setTimeout前面。实际上,这种情况只发生在递归调用的时候。

setImmediate(function (){
  setImmediate(function A() {
      console.log(1);
      setImmediate(function B(){console.log(2);});
  });
  setTimeout(function timeout() {
    console.log('TIMEOUT FIRED');
  }, 0);
});
// 1
// TIMEOUT FIRED
// 2

setImmediate和setTimeout被封装在一个setImmediate里面,它的运行结果总是1--TIMEOUT FIRED--2,这时函数A一定在timeout前面触发。至于2排在TIMEOUT FIRED的后面(即函数B在timeout后面触发),是因为setImmediate总是将事件注册到下一轮Event Loop,所以函数A和timeout是在同一轮Loop执行,而函数B在下一轮Loop执行。
我们由此得到了process.nextTick和setImmediate的一个重要区别:多个process.nextTick语句总是在当前"执行栈"一次执行完,多个setImmediate可能则需要多次loop才能执行完。事实上,这正是Node.js 10.0版添加setImmediate方法的原因,否则像下面这样的递归调用process.nextTick,将会没完没了,主线程根本不会去读取"事件队列"!

process.nextTick(function foo() {
  process.nextTick(foo);
});

相关文章

  • 任务队列之nodejs中的process.nextTick和se

    原文:http://www.ruanyifeng.com/blog/2014/10/event-loop.html...

  • 异步任务中在分为宏任务和微任务

    常见的微任务有:process.nextTick、Promise和 MutationObserver(监听DOM变...

  • 主队列和主线程

    队列的概念和作用: 队列不是线程,队列是用来组织任务的,将任务加到队列中,任务会按照加入到队列中先后顺序依次执行,...

  • 关于GCD中的队列、线程、任务之间的关系及死锁的理解

    1. 任务与队列之间的关系 任务产生后被加入到某个队列中,队列仅保管任务,不执行任务; 队列分为串行队列和并行队列...

  • Event Loop

    宏任务:setTImeout、setInterval微任务:Promise、process.nextTick(ca...

  • 宏队列与微队列

    js执行时有两个异步队列:宏队列和微队列。优先执行微队列中的任务,而且每次执行完宏队列中的任务后,都会查看微队列中...

  • NSOperation相关

    GCD和NSOperation比较 GCD :任务+队列步骤:创建队列--->使用函数将封装的任务添加到队列中 N...

  • 微任务和宏任务

    JS是单线程的,可以把这个线程叫做主线程,主线程中包含宏任务队列和微任务队列,宏任务所在的队列就叫宏任务队列,微任...

  • 一、GCD 串行并行、同步异步

    GCD 一、 两个核心概念:任务和队列 任务:执行什么操作 队列:用来存放任务 将任务添加到队列中,GCD会自动...

  • iOS 多线程:GCD

    同步执行(sync): 同步添加任务到指定的队列中,在添加的任务执行结束之前,会一直等待,直到队列里面的任务完成之...

网友评论

      本文标题:任务队列之nodejs中的process.nextTick和se

      本文链接:https://www.haomeiwen.com/subject/xiutextx.html