美文网首页
NodeJS的Event Loop

NodeJS的Event Loop

作者: Polarpole | 来源:发表于2017-09-13 20:49 被阅读0次

NodeJS的Event Loop是用Libuv实现的。核心驱动为uv_run函数,使用的是UV_RUN_ONCE模式,尽可能在一次uv_run周期中处理I/O的回调。(loop alive会判断有没有进行中的异步请求。)

uv_run运行周期

NodeJS的一次Event Loop周期会经历N个阶段,每个阶段结束后会进入下个阶段。来自官方NodeJS文档。

   ┌───────────────────────┐
┌─>│        timers         │
│  └──────────┬────────────┘
│  ┌──────────┴────────────┐
│  │     I/O callbacks     │
│  └──────────┬────────────┘
│  ┌──────────┴────────────┐
│  │     idle, prepare     │
│  └──────────┬────────────┘      ┌───────────────┐
│  ┌──────────┴────────────┐      │   incoming:   │
│  │         poll          │<─────┤  connections, │
│  └──────────┬────────────┘      │   data, etc.  │
│  ┌──────────┴────────────┐      └───────────────┘
│  │        check          │
│  └──────────┬────────────┘
│  ┌──────────┴────────────┐
└──┤    close callbacks    │
   └───────────────────────┘

timer:处理就绪的timer 回调队列。(setTimeout或setInterval的callback)
I/O:处理就绪的I/O 回调队列。(对应uv_run的pending阶段)
idle,prepare:处理就绪的internal 回调队列。
poll:处理就绪的I/O 回调队列或阻塞。
check:处理就绪的check 回调队列。(setImmediate的callback)
close:处理就绪的句柄关闭回调。(资源回收时设定的close 回调)

当一个阶段将当前属于自己的回调队列处理完毕就会进入下一个阶段。所谓的“就绪”,是指进入这个【阶段前】就已经完成异步请求准备触发的回调。

poll阶段比较特殊,他有可能阻塞Node的线程。
如果在当前Event Loop周期有过I/O回调事件的产生,又或是其他阶段有异步回调可以处理,那么poll阶段就不会阻塞。
如果没有,Node的线程就会在这阶段休眠,等待I/O或timer回调事件的产生。

poll阶段的阻塞作用在于没有可执行的异步事件时,就此休眠线程,避免忙轮询。(查资料很容易得知,poll阶段内核是选择各个平台最好的实现。然而,似乎为了统一在各个平台的Event Loop,这个阶段只会被I/O回调事件唤醒或超时结束。)

Event Loop在选择低耗能的阻塞线程前,会尽可能地完成一次Loop周期,这样的行为正好说明了它非常注重每种异步回调的实时性。至于为什么要划分如此多的队列和阶段就不得而知了。

实际上,在一次Event Loop的close阶段后,还会进行一次timer回调队列的处理。因为有poll阶段的阻塞耗时,这时很可能有超时的回调可以执行。

值得一提的是,process.nextTick和Promise事件会往microTask队列加入回调,而microTask会在每个阶段结束时清空,这时Event Loop才进入下一个阶段。

相关文章

  • 性能优化2.1笔记

    event-loop https://nodejs.org/en/docs/guides/event-loop-t...

  • iOS RunLoop由浅入深

    Event Loop Event Loop事件循环机制,如javascript的事件循环,以及依赖其的nodejs...

  • event loop

    精华结论 浏览器的 Event Loop 遵循的是 HTML5 标准,而 NodeJs 的 Event Loop ...

  • Event loop

    为什么要了解Event loop?理解Event loop,对于浏览器(或者nodejs)处理事件的过程会有更透彻...

  • 不要在nodejs中阻塞event loop

    简介 我们知道event loop是nodejs中事件处理的基础,event loop中主要运行的初始化和call...

  • Nodejs 解读event loop的事件处理机制

    摘要:1. nodejs 为什么要存在一个event loop的事件处理机制?2. event loop的事件处理...

  • Nodejs Event Loop

    Nodejs Event Loop 什么是Nodejs Node.js 是一个javascript runtime...

  • Event Loop

    什么是Event Loop? event loop是一个执行模型,在不同的地方有不同的实现。浏览器和NodeJS基...

  • NodeJs event loop

    V8有个task queue,IO event,timeout,interval事件会往task queue放入c...

  • nodejs event loop

    1.线程的问题 2.各个方法优先级的问题 需要知道宏任务,微任务的概念。process.nextTick() 3....

网友评论

      本文标题:NodeJS的Event Loop

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