Node.js 非阻塞 I/O 与 EventLoop 机制

非堵塞 IO、事件循环(Event Loop)和事件队列是现代 JavaScript 和 Node.js 应用程序中用于处理异步操作的核心概念。它们共同工作,使得在单线程环境下能够高效地处理输入/输出操作。以下是这些概念的详细解释:https://www.nowcoder.com/issue/tutorial?zhuanlanId=j572L2&uuid=19017e996e2444a8b05bf61a3285892f

1. 非堵塞 IO
非堵塞 IO(Non-blocking IO)是一种输入输出操作的方式,它不会阻塞程序的执行。传统的阻塞 IO 会使得程序在等待一个操作完成时暂停执行,这可能导致效率低下。非堵塞 IO 则允许程序继续执行其他任务,直到数据准备好或者操作完成。

在 Node.js 中,很多 IO 操作(如文件读取、数据库查询和网络请求等)都是非堵塞的。这意味着,发起一个 IO 操作后,Node.js 不会等到操作完成才继续执行后面的代码,而是立即返回,待操作完成时,通过回调函数、Promises 或 async/await 来处理结果。

2. 事件循环(Event Loop)
事件循环(Event Loop)是 JavaScript 的一种机制,负责管理异步操作的运行。由于 JavaScript 是单线程的,事件循环的主要目的是协调执行栈(call stack)和事件队列(event queue),处理异步操作。

事件循环的工作流程如下:

执行栈(Call Stack):所有的 JavaScript 代码都是在执行栈中执行的。当前执行的任务会被压入栈中,完成后从栈中弹出。

事件队列(Event Queue):当异步操作完成(如网络请求、定时器等),相应的回调函数会被放入事件队列中,等待执行栈闲暇时进行处理。

事件循环的运行:

事件循环会不断检查执行栈是否为空。如果栈为空,它会从事件队列中取出第一个事件,并将其执行(即执行对应的回调函数)。
如果执行栈不为空,它会继续执行栈中的任务,直到栈清空。
这个机制保证了 JavaScript 在处理异步任务时的高效性,不会因为等待 IO 操作而阻塞整个程序的执行。
全部评论

相关推荐

03-25 11:39
已编辑
门头沟学院 前端工程师
雪球一二面是一起的,三面和HR面一起一面(55min)1. 自我介绍、项目、实习2. 基本数据类型、引用数据类型,判断数据类型的方式,instanceof原理3. 详细说说symbol用法,有了对象为什么还要有map4. vue2与vue3的区别5. Promise,async/await原理,事件循环6. 手撕:Promise.all7. 浏览器事件监听机制,可以控制冒泡和捕获吗,具体怎么控制;8. 如果一个列表有成千上万项,每个项都有点击事件如何优化9. 浏览器缓存,输入URL到展示页面做了什么10. 详细说说DNS解析,在本地环境下走缓存的顺序,配置过本地host吗,主要解决什么问题?11. http状态码304什么条件下触发12. 说说数组的方法,知道copyWithin吗(不知道)13. css选择器优先级14. 了解BFC吗15. flex用的多吗,flex:1是什么意思16. 手撕:防抖17. 手撕:斐波那契数列,尾递归优化,再写个迭代模式的二面(40min)1. 展示项目,探讨低代码应用场景2. 实习期间做了什么,帮助最大的是什么3. 大学期间做过什么事情帮助最大(网安俱乐部,Web方向)4. 详细说一个你知道的Web安全的点,怎么避免5. 竞赛期间感受最深的是什么6. 除了技术,还有别的爱好吗,台球打得怎么样7. 还有投递别的城市吗,现在有offer吗聊天过程中涉及到,vue2和vue3区别,nexttick(),echarts和d3js三面(25min)+ HR面(40min)主管面主要问项目+展示,HR面主要是谈经历就不细写了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务