文中提到的event loop均是指node.js中的。
一般网络上讲解的event loop,都会出现这张图:
libuv的核心开发者Bert Belder觉得不太正确,他认为下面这张图更接近libuv的event loop原理,但也不完全正确:
他认为真正的event loop应该差不多是这样的:
图中左侧分别有入口和出口箭头,入口代表node js文件开始执行,出口代表执行完成;
黄色JS方块代表同步JS的执行;
其他图标分别对应node.js官网中event loop的讲解[1]
┌───────────────────────────┐
┌─>│ 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))
每个图标是一种类型的callback任务队列,图标之间都会执行JS同步代码;
同步代码中出现异步的API时,对一个全局计数器ref++,然后交给相应图标对应的模块去处理;
处理完成之后放到对应的图标中,同时对全局计数器ref--;
扫帚图标(close callbacks)之后,如果ref为0,则结束js运行,如果大于0,则继续loop;
参考来源:
[1] Everything You Need to Know About Node.js Event Loop - Bert Belder
[2] The Node.js Event Loop
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。