文中提到的event loop均是指node.js中的。
通常网络上讲解的event loop,都会出现这张图:node
libuv的核心开发者Bert Belder以为不太正确,他认为下面这张图更接近libuv的event loop原理,但也不彻底正确:网络
他认为真正的event loop应该差很少是这样的:异步
图中左侧分别有入口和出口箭头,入口表明node js文件开始执行,出口表明执行完成;
黄色JS方块表明同步JS的执行;
其余图标分别对应node.js官网中event loop的讲解[1]socket
┌───────────────────────────┐ ┌─>│ timers │ │ └─────────────┬─────────────┘ │ ┌─────────────┴─────────────┐ │ │ pending callbacks │ │ └─────────────┬─────────────┘ │ ┌─────────────┴─────────────┐ │ │ idle, prepare │ │ └─────────────┬─────────────┘ ┌───────────────┐ │ ┌─────────────┴─────────────┐ │ incoming: │ │ │ poll │<─────┤ connections, │ │ └─────────────┬─────────────┘ │ data, etc. │ │ ┌─────────────┴─────────────┐ └───────────────┘ │ │ check │ │ └─────────────┬─────────────┘ │ ┌─────────────┴─────────────┐ └──┤ close callbacks │ └───────────────────────────┘
闹钟图标表明:timers (setTimeout, setInterval)
独角兽图标表明:poll
感叹号图标表明:check (setImmediately)
扫帚图标表明:close callbacks(好比socket.on('close', callback))ide
每一个图标是一种类型的callback任务队列,图标之间都会执行JS同步代码;
同步代码中出现异步的API时,对一个全局计数器ref++,而后交给相应图标对应的模块去处理;
处理完成以后放到对应的图标中,同时对全局计数器ref--;
扫帚图标(close callbacks)以后,若是ref为0,则结束js运行,若是大于0,则继续loop;oop
参考来源:
[1] Everything You Need to Know About Node.js Event Loop - Bert Belder
[2] The Node.js Event Loopui