美文网首页让前端飞
nodejs事件循环

nodejs事件循环

作者: 88b61f4ab233 | 来源:发表于2018-10-26 20:59 被阅读7次

    1. 只有一个主线程,node开始执行脚本时,会先进事件循环初始化(同步任务,发出异步请求,规划定时器生效时间,执行promise.nextTick等),这时事件循环还未开始。

    nodejs运行机制:
    1. V8引擎解析js脚本
    2. 解析后的代码调用Node API
    3. 库负责Node API的执行,它将不同的任务分配给不同的线程,形成一个Event Loop,以异步的方式将任务的执行结果返回给V8引擎
    4. V8引擎再将结果返回给用户

    2.nodejs每一轮事件循环的六个阶段(事件循环会无限次执行,直到异步任务的回调函数队列清空才会停止执行):

    1. timers(处理setTimeoutsetInterval的回调函数)
    2. I/O callbacks(除了setTimeoutsetIntervalsetImmediate、用于关闭请求的回调函数)
    3. idlepreparelibuv内部使用)
    4. poll(等待还未返回的I/O事件)
    5. checksetImmediate
    6. close callbacks(执行关闭请求的回调,如socket.on('close', ...)

    3. setTimeoutsetImmediate

    由于setTimeout第二个参数默认为0,但是加上node做不到真正的0ms,最少也需要1s;所以实际执行进入事件循环后,如果没到1ms,那么timers阶段就会跳过进入check阶段,所以执行顺序不确定。

    4. 异步任务分两种:

    本轮循环:promise.nextTickpromise的回调函数

    次轮循环:setTimeoutsetIntevalsetImmediate的回调函数

    1. 多个process.nextTick语句总是在当前"执行栈"一次执行完,多个setImmediate可能则需要多次loop才能执行完;

    6. 为什么process.nextTick 永远大于 promise.then?因为Node中,_tickCallback在每一次执行完TaskQueue中的一个任务后被调用,而这个_tickCallback中实质上干了两件事:

    • nextTickQueue中所有任务执行掉(长度最大1e4,Node版本v6.9.1)
    • 第一步执行完后执行_runMicrotasks函数,执行microtask中的部分(promise.then注册的回调)

    相关文章

      网友评论

        本文标题:nodejs事件循环

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