node.js中对同步,异步,阻塞与非阻塞的理解
我们都知道javascript是单线程的,node.js是一个基于Chrome V8 引擎的 javascript 运行时环境,注意 node.js 不是一门语言,别搞错了。
javascript为什么是单线程的,这么做有什么好处?
因为历史原因,js的出现主要是为了解决页面的交互和操作DOM,如果是多线程的,就会带来比较复杂的同步问题。
比如两个线程同时操作一个DOM,那最终页面显示上会以哪个线程操作为准,这就是个问题。而单线程就没有这种问题。
创建线程是需要消耗资源的,早期js是嵌在网页中被浏览器解释运行的,如果是多线程那必然会消耗比较多的资源,显然与js的定位不符。
还有多线程之间的上下文切换也会比较消耗时间,这也是js是单线程的原因,估计js单线程这个特征以后也不会改变。
单线程的好处:1、没有线程间同步问题。2、节省创建线程资源。3、节省上下文切换时间。
但是单线程也有问题,所有的操作都必须一个一个来,如果中间有一个操作非常耗时,那整个运行都会阻塞在那里。
为了解决这个问题,js引入了事件和回调函数机制,对于一个IO操作,比如一个ajax,当发出一个异步请求后,程序不会阻塞在那里等待结果的返回,而是继续执行下面的代码。
当请求成功获取到结果后,就会调用回调函数来处理后面的事情,这个就是异步的非阻塞。
当然,异步 与 非阻塞,同步 与 阻塞,这两者之间概念很容易搞混。
一、同步与异步关注的是消息的通知方式。
同步,当发起一个调用时,在没有获取结果之前,调用不会返回,直到获取结果。事一件一件做,做完一件再做下一件。
异步,当发起一个调用时,在没有获取结果之前,调用就返回了,调用者并不会立即得到结果,而是被调用者通知调用者。通过回调函数处理结果。
二、阻塞与非阻塞关注的是等待结果(返回值)时的状态
阻塞,在等待结果的过程中,不能干其他事,线程被挂起,直到结果返回。
非阻塞,在等待结果的过程中,还能干其他事,线程不会被阻塞。
同步阻塞方式:
比如,你打电话问老婆今晚吃什么,老婆在电话那边一直想啊想,你在电话这边不干别的,就一直等啊等,电话始终未挂,直到她说吃火锅,电话才挂掉。
同步非阻塞方式:
比如,你打电话问老婆今晚吃什么,老婆在电话那边一直想啊想,你在电话这边该干什么干什么,电话始终未挂,直到她说吃火锅,电话才挂掉。
异步阻塞方式:
比如,你打电话问老婆今晚吃什么,老婆说我想想,过一会跟你打话。你在电话这边什么也没干,就一直等着这个电话。
异步非阻塞方式:
比如,你打电话问老婆今晚吃什么,老婆说我想想,过一会跟你打话。你在电话这边想干什么干什么,如果有电话来了,再处理电话。
同步与异步是被调用方决定的,决定是马上给你答案,还是过会通知你,给你答案。
阻塞与非阻塞是调用方决定的,在等待结果的过程中, 是否还可以干其他事。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构