zoukankan      html  css  js  c++  java
  • node.js中的定时器nextTick()和setImmediate()的区别分析

    1.node中使用定时器的问题在于,它并非精确的.譬如setTimeout()设定一个任务在10ms后执行,但是在9ms后,有一个任务占用了5ms,再次轮到定时器时,已经耽误了4ms.

    好了node中的定时器就简单的讲这么多.

    2.看代码:

    复制代码 代码如下:

    process.nextTick(function(){
        console.log("延迟执行");
    });
    console.log("正常执行1");
    console.log("正常执行2");
    console.log("正常执行3");
    console.log("正常执行4");

    通过这个例子,我想大家很清楚的就能看到nextTick()是用来干嘛的了.主要是用来异步执行的.

    在看代码:

    复制代码 代码如下:

     setImmediate(function(){
         console.log("延迟执行");
     });
     console.log("正常执行");

    我们发现setImmediate也是异步执行的.奇怪了

    那么它与nextTick()有什么区别呢?

    看代码:

    代码一:

    复制代码 代码如下:

    process.nextTick(function(){
        console.log("nextTick延迟")
    });
    setImmediate(function(){
        console.log("setImmediate延迟");
    });
    console.log("正常执行");

    结果:

    代码二:

    复制代码 代码如下:

    setImmediate(function(){
        console.log("setImmediate延迟");
    });
    process.nextTick(function(){
        console.log("nextTick延迟")
    });
    console.log("正常执行");

    结果:

    发现代码虽然顺序不一样,但是执行的结果是一样的.

    从结果可以发现:

    nextTick()的回调函数执行的优先级要高于setImmediate();

    process.nextTick()属于idle观察者,setImmediate()属于check观察者.在每一轮循环检查中,idle观察者先于I/O观察者,I/O观察者先于check观察者.

    在具体实现上,process.nextTick()的回调函数保存在一个数组中,
    setImmediate()的结果则是保存在链表中.
    在行为上,process.nextTick()在每轮循环中会将数组中的回调函数全部执行完.
    而setImmediate()在每轮循环中执行链表中的一个回调函数.

    复制代码 代码如下:

    //加入2个nextTick()的回调函数
    process.nextTick(function(){
        console.log("nextTick延迟执行1");
    });
    process.nextTick(function(){
        console.log("nextTick延迟执行2");
    });
    //加入两个setImmediate()回调函数
    setImmediate(function(){
        console.log("setImmediate延迟执行1");
        process.nextTick(function(){
            console.log("强势插入");
        });
    });
    setImmediate(function(){
        console.log("setImmediate延迟执行2");
    });
    console.log("正常执行");

    从执行结果上看出:当第一个setImmediate()的回调函数执行完后,并没有立即执行第二个,而是进入了下一轮循环,再次按nextTick()优先,setImmediate()次后的顺序执行.之所以这样设计,是为了保证每次循环能够较快的执行结束.防止CPU占用过多而阻塞后续I/O调用的情况.

  • 相关阅读:
    [Codeforces 1214A]Optimal Currency Exchange(贪心)
    [Codeforces 1214D]Treasure Island(dfs)
    [BZOJ 3512]DZY Loves Math IV(杜教筛)
    [BZOJ 3930] [CQOI 2015]选数(莫比乌斯反演+杜教筛)
    [BZOJ 2154]Crash的数字表格(莫比乌斯反演)
    【莫比乌斯反演+分块】BZOJ1101-[POI2007]Zap
    【状态压缩DP】BZOJ1087-[SCOI2005]互不侵犯King
    【概率DP】BZOJ4318-OSU!
    【最大权闭合子图/最小割】BZOJ3438-小M的作物【待填】
    【莫比乌斯反演】HDU1695_GCD
  • 原文地址:https://www.cnblogs.com/luyingying/p/5473178.html
Copyright © 2011-2022 走看看