zoukankan      html  css  js  c++  java
  • Node.js中Process.nextTick()和setImmediate()的区别

    一、Webstrom使用node.js IDE的问题

    在区别这两个函数之前来说一下Webstrom使用node.js IDE的问题,在配置Node.js的IDE了,但setImmediate()、require等这些node.js中内置的函数时并不会有提示,要解决这个问题只要设置一下Webstrom,File---->Setting---->Languages&Frameworks------>Node.js and NPM中的Node.js core Library is not enabled设为Enable.

    二、两者的区别

    1.在理解两者的区别之前要说一下轮询

    前面博客也有记录,nodejs中是事件驱动的,有一个循环线程一直从事件队列中取任务执行或者I/O的操作转给后台线程池来操作,把这个循环线程的每次执行的过程算是一次轮询.

    2.setImmediate()的使用

    即时计时器立即执行工作,它是在事件轮询之后执行,为了防止轮询阻塞,每次只会调用一个。

    3.Process.nextTick()的使用

    它和setImmediate()执行的顺序不一样,它是在事件轮询之前执行,为了防止I/O饥饿,所以有一个默认process.maxTickDepth=1000来限制事件队列的每次循环可执行的nextTick()事件的数目。

    4.总结

    在网上百度的关于它们的总结:

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

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

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

    5.代码demo

    //加入2个nextTick()的回调函数
    process.nextTick(function(){
        console.log("nextTick延迟执行A");
    });
    process.nextTick(function(){
        console.log("nextTick延迟执行B");
        setImmediate(function(){
            console.log("setImmediate延迟执行C");
        });
        process.nextTick(function(){
            console.log("nextTick延迟执行D");
        });
    });
    //加入两个setImmediate()回调函数
    setImmediate(function(){
        console.log("setImmediate延迟执行E");
        process.nextTick(function(){
            console.log("强势插入F");
        });
        setImmediate(function(){
            console.log("setImmediate延迟执行G");
        });
    });
    setImmediate(function(){
        console.log("setImmediate延迟执行H");
        process.nextTick(function(){
            console.log("强势插入I");
        });
        process.nextTick(function(){
            console.log("强势插入J");
        });
        setImmediate(function(){
            console.log("setImmediate延迟执行K");
        });
    });
    console.log("正常执行L");

    输出结果:

    "C:Program Files (x86)JetBrainsWebStorm 11.0.3in
    unnerw.exe" F:
    odejs
    ode.exe Immediate.js
    正常执行L
    nextTick延迟执行A
    nextTick延迟执行B
    nextTick延迟执行D
    setImmediate延迟执行E
    setImmediate延迟执行H
    setImmediate延迟执行C
    强势插入F
    强势插入I
    强势插入J
    setImmediate延迟执行G
    setImmediate延迟执行K
    
    Process finished with exit code 0

     关于执行顺序的问题很不容易搞明白,说实话现在我对它还是不是太理解,希望有大神能给讲明白。

  • 相关阅读:
    Windows API—CreateEvent—创建事件
    C++的注册和回调
    Python内置模块-logging
    使用 C++ 处理 JSON 数据交换格式
    Python生成器
    5.Spring-Boot缓存数据之Redis
    6.Spring-Boot项目发布到独立的tomcat中
    7.Spring-Boot自定义Banner
    8.Spring-Boot之SpringJdbcTemplate整合Freemarker
    9.Spring-Boot之Mybatis-LogBack-Freemarker
  • 原文地址:https://www.cnblogs.com/5ishare/p/5268273.html
Copyright © 2011-2022 走看看