nodejs事件循环

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

    nodejs运行机制:git

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

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

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

3. setTimeout和setImmediate:promise

    因为setTimeout第二个参数默认为0,可是加上node作不到真正的0ms,最少也须要1s;因此实际执行进入事件循环后,若是没到1ms,那么timers阶段就会跳过进入check阶段,因此执行顺序不肯定。异步

4. 异步任务分两种:socket

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

    次轮循环:setTimeout、setInteval、setImmediate的回调函数oop

5. 多个process.nextTick语句老是在当前"执行栈"一次执行完,多个setImmediate可能则须要屡次loop才能执行完;线程

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

  •  nextTickQueue中全部任务执行掉(长度最大1e4,Node版本v6.9.1)
  •  第一步执行完后执行_runMicrotasks函数,执行microtask中的部分(promise.then注册的回调)
相关文章
相关标签/搜索