当前位置: 首页 > 后端技术 > Node.js

libuv核心开发者眼中的Node.jsEventloop

时间:2023-04-03 19:30:00 Node.js

本文提到的事件循环指的是node.js。一般网上解释的事件循环中会出现这张图:libuv的核心开发者BertBelder认为是不正确的。他认为下图更接近libuv的事件循环原理,但也不完全正确:他认为真正的事件循环应该是这样的:图中左侧有入口和出口箭头。入口代表nodejs文件执行,出口代表执行完成;黄色的JS方块代表同步JS的执行;其他图标对应node.js官网事件循环解释[1]┌────────────────────────────────────────┐┌──>│计时器││└──────────────────┬────────────────┘│┌────────────────────────────────────────────────────────────────────────┐││等待回调││└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┴──────────────┐││空闲,准备││└─────────────────────────────────────────────────────────────────────────┌┌──────────────┐│┌────────────────────────┐│传入:│││投票│<──────┤连接,││└──────────────────────────────────────────────────────────────────────────────┘│data等││┌────────────────┴──────────────────────────────────────────────────────────────┘││检查││└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┴──────────────┐└──┤关闭回调│└────────────────────────────┘闹钟图标代表:定时器(setTimeout,setInterval)独角兽图标代表:poll感叹号图标代表:check(setImmediately)扫帚图标代表:关闭回调(如socket.on('close',callback))每个图标都是一种回调任务队列,它们之间会执行iconJS同步代码;当同步代码中出现异步API时,处理一个全局计数器ref++,然后交给相应图标对应的模块处理;处理完成后放入相应图标,全局计数器ref--;扫帚图标(关闭回调)后,如果ref为0,则js运行结束,如果大于0,继续循环;参考来源:[1]EverythingYouNeedtoKnowAboutNode.jsEventLoop-BertBelder[2]TheNode.jsEventLoop