最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
当前位置: 首页 - 科技 - 知识百科 - 正文

Node.js Event Loop各阶段讲解

来源:懂视网 责编:小采 时间:2020-11-27 22:00:10
文档

Node.js Event Loop各阶段讲解

Node.js Event Loop各阶段讲解:Event Loop阶段描述图 timers timer阶段处理setTimeout于setInterval回调,开始处理的时机与poll阶段有关联。 pending callbacks 该阶段执行某些系统操作的回调,比如TCP套接字在连接时收到ECONNREFUSED。 网上有一些将该阶段称为I/O ca
推荐度:
导读Node.js Event Loop各阶段讲解:Event Loop阶段描述图 timers timer阶段处理setTimeout于setInterval回调,开始处理的时机与poll阶段有关联。 pending callbacks 该阶段执行某些系统操作的回调,比如TCP套接字在连接时收到ECONNREFUSED。 网上有一些将该阶段称为I/O ca

  • 处理该阶段队列中的事件
  • 当进入poll阶段,如果队列不为空且没有就绪的timer,Node.js会在这里执行队列中的callback直到队列为空或者执行的callback数达到系统设定的某个值。随后Node.js检查是否存在预设的setImmediate,存在话就进入check阶段,否则开始检查timer就绪情况选择回到timer阶段或者进入check阶段。

    对于poll阶段,通过阅读官方的文档有些细节也没弄清楚,用伪代码表示出来:

    enter pool phase:
    if (has timer scheduled) {
     // 官方没有提到这种情况会做什么
    }
    else {
     if (isEmpty(queue)) {
     if (has(setImmediate)) {
     // 进入check阶段
     }
     else if (!isEmpty(timer)) {
     // 回到timer阶段
     }
     else {
     // 等待新的I/O事件
     // 新的I/O事件触发回调立即执行,执行完成之后的逻辑不清楚
     }
     // 目前看来只有存在setImmediate时才会进入check阶段,这肯定不合理
     }
     if (!isEmpty(queue)) {
     let result = execute(queue);
     if (result === 'queue is empty') {
     // 官方没讲后续逻辑
     // 猜测是回到队列为空的处理逻辑中
     }
     if (result === 'reached hard limit') {
     // 官方没有解释这里的后续逻辑
     // 也许与queue is empty一样对待
     }
     }
    }

    疑惑重点是从poll阶段出来的时机以及去向不是非常明确,但以我目前的水平和精力只能到此为止。

    check

    当poll阶段执行完成会进入到check阶段执行,该阶段的执行内容是所有setImmediate回调。

    close callbacks

    socket的异常关闭,'close'事件的回调会在该阶段执行。

    process.nextTick

    process.nextTick经常被用来做异步调用,但它并不属于事件循环的内容,process.nextTick中的回调被放在nextTickQueue中等待“当前操作”完成后被立即处理,与事件循环中的阶段没有联系,当前操作的原文定义是:“An operation is defined as a transition from the underlying C/C++ handler, and handling the JavaScript that needs to be executed.”,指的是在一段Javascript代码执行完切换到C/C++层时会处理nextTickQueue。

    文章提到了一个特例是Deduplication,这是Node.js内部一个优化特性,当在timer和check阶段,同时有多个需要执行的回调时,切换只会发生一次,所以nextTick回调执行在这种情况下看似有所延后。

    代码示例:

    setImmediate(() => {
     console.log('1');
     process.nextTick(() => console.log('2'));
    });
    setImmediate(() => {
     console.log('3');
     process.nextTick(() => console.log('4'));
    });

    存在两个setImmediate,进入check阶段后需要在执行所有setImmediate的回调代码后才会产生切换,从而执行nextTick回调,因此上面代码的运行结果是:“1 3 2 4”,除上述场景外,nextTick都会先于setImmediate执行。

    总结

    因为Node.js的Event Loop我看了有那么2、3回,但经常忘,所以这次记录下来,做个备忘。由于太多知识容易忘记,又发现写文章的一个优点:“帮助记忆便于复习”。

    声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文档

    Node.js Event Loop各阶段讲解

    Node.js Event Loop各阶段讲解:Event Loop阶段描述图 timers timer阶段处理setTimeout于setInterval回调,开始处理的时机与poll阶段有关联。 pending callbacks 该阶段执行某些系统操作的回调,比如TCP套接字在连接时收到ECONNREFUSED。 网上有一些将该阶段称为I/O ca
    推荐度:
    标签: 详解 event 阶段
    • 热门焦点

    最新推荐

    猜你喜欢

    热门推荐

    专题
    Top