Node.JS中事件轮询(Event Loop)的解析
发布时间 - 2026-01-10 23:16:31 点击率:次当我们知道I/O操作和创建新线程的开销是巨大的!

网站延迟的开销
对于一个网站,后台大多不需要进行复杂的计算,我们的程序大多时间花费在I/O读取上。
看到一个数据:IO操作可以比数据处理慢几个数量级。高端SSD固态硬盘的读取速度可以达到200mb-700mb/s;读取1000字节需要1.4微秒。而在此期间,2GHZ频率的CPU可以执行28000个指令处理周期。而网络数据的IO甚至更慢!
NodeJS采用单线程非阻塞的架构解决老大难的IO问题
当采用多线程时,为每一个请求开启一个新的线程(Apache就是这样做的)。当并发增多,线程的消耗会十分严重。
什么是阻塞和非阻塞呢?
阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。
非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。
var fs = require("fs");
fs.readFile("./testfile", "utf8", function(error, file) {
if (error) throw error;
console.log("我读完文件了!");
});
console.log("我不会被阻塞!");
用node执行以下代码,会先输出我不会被阻塞,再输出我读完文件了
一个知乎的回答:
你打电话问书店老板有没有《分布式系统》这本书,你如果是阻塞式调用,你会一直把自己“挂起”,直到得到这本书有没有的结果,如果是非阻塞式调用,你不管老板有没有告诉你,你自己先一边去玩了, 当然你也要偶尔过几分钟check一下老板有没有返回结果。
NodeJS的事件轮询
这是node虽然为单线程,但是可以处理大并发,高吞吐量的核心。一个事件轮询拥有下面三个组件
- 事件队列:这是一个FIFO模型的队列,一方推入事件,另一方推出事件
- 队列的读取轮询线程组件,也就是主角Event Loop,
- 单独的线程池,用来执行长任务(也就是threadpool,node底层,用C++写的,不会阻塞)
在nodejs中,只有一个主线程(也就是前面说的单线程)来不断读取轮询(书中称为调用I/O观察者)队列中是否有事件。
而对于读取文件,HTTP
请求等(现代cpu处理能力很强,事件处理相当快,导致运行速度下降的瓶颈在I/O)比较容易堵塞的事件,就在这个单线程中
执行肯定会造成堵塞,所以Event Loop
会把这类型的事件交给底层的线程池执行,并给予线程池一个回调函数,当线程池操作
完成这堵塞任务后,便把结果和回调函数一起再放入轮询队列中。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。
# node
# 事件轮询
# nodejs
# event
# loop
# 轮询
# JavaScript Event Loop相关原理解析
# 前端js中的事件循环eventloop机制详解
# javascript中的event loop事件循环详解
# JavaScript中EventLoop介绍
# Node.js事件循环(Event Loop)和线程池详解
# JavaScript运行机制之事件循环(Event Loop)详解
# JS事件循环机制event loop宏任务微任务原理解析
# 单线程
# 我不会
# 这本书
# 回调
# 挂起
# 这是
# 几个
# 老大难
# 就在
# 你会
# 在此
# 也要
# 不需要
# 才会
# 是指
# 告诉你
# 你自己
# 这是一个
# 这类
# 这样做
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何与Docker(Sail)协同开发?(环境搭建教程)
如何在香港免费服务器上快速搭建网站?
Laravel怎么自定义错误页面_Laravel修改404和500页面模板
怎么用AI帮你设计一套个性化的手机App图标?
Laravel如何使用软删除(Soft Deletes)功能_Eloquent软删除与数据恢复方法
Laravel如何实现事件和监听器?(Event & Listener实战)
今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】
如何为不同团队 ID 动态生成多个“认领值班”按钮
Laravel中间件如何使用_Laravel自定义中间件实现权限控制
Midjourney怎样加参数调细节_Midjourney参数调整技巧【指南】
网站制作软件有哪些,制图软件有哪些?
大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?
Android使用GridView实现日历的简单功能
laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法
Laravel如何配置Horizon来管理队列?(安装和使用)
原生JS获取元素集合的子元素宽度实例
移动端脚本框架Hammer.js
Win11摄像头无法使用怎么办_Win11相机隐私权限开启教程【详解】
UC浏览器如何切换小说阅读源_UC浏览器阅读源切换【方法】
微信小程序 require机制详解及实例代码
php增删改查怎么学_零基础入门php数据库操作必知基础【教程】
如何用已有域名快速搭建网站?
Laravel Eloquent访问器与修改器是什么_Laravel Accessors & Mutators数据处理技巧
如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?
Laravel中间件起什么作用_Laravel Middleware请求生命周期与自定义详解
Laravel如何设置定时任务(Cron Job)_Laravel调度器与任务计划配置
非常酷的网站设计制作软件,酷培ai教育官方网站?
Laravel如何配置.env文件管理环境变量_Laravel环境变量使用与安全管理
如何确认建站备案号应放置的具体位置?
如何快速建站并高效导出源代码?
Laravel策略(Policy)如何控制权限_Laravel Gates与Policies实现用户授权
Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】
html5源代码发行怎么设置权限_访问权限控制方法与实践【指南】
Linux安全能力提升路径_长期防护思维说明【指导】
网站图片在线制作软件,怎么在图片上做链接?
Google浏览器为什么这么卡 Google浏览器提速优化设置步骤【方法】
美食网站链接制作教程视频,哪个教做美食的网站比较专业点?
Laravel如何创建自定义Artisan命令?(代码示例)
Laravel如何处理文件上传_Laravel Storage门面实现文件存储与管理
深圳防火门网站制作公司,深圳中天明防火门怎么编码?
Laravel怎么实现一对多关联查询_Laravel Eloquent模型关系定义与预加载【实战】
JavaScript数据类型有哪些_如何准确判断一个变量的类型
如何在橙子建站上传落地页?操作指南详解
Laravel路由怎么定义_Laravel核心路由系统完全入门指南
网页设计与网站制作内容,怎样注册网站?
C++时间戳转换成日期时间的步骤和示例代码
Laravel如何处理和验证JSON类型的数据库字段
如何在阿里云服务器自主搭建网站?
购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?
Laravel项目如何进行性能优化_Laravel应用性能分析与优化技巧大全
上一篇: 景德镇医疗招聘,景德镇医院几点上班?
上一篇: 景德镇医疗招聘,景德镇医院几点上班?

