js真的是单线程实现异步并发么?

引言

js单线程确实实现了异步/并发么,确实是实现了

初入者可能会觉得,这是自然的,异步同步,多自然呀,这就是实现了,而学医了解过一段时间的人可能会觉得,一个单线程,无论如何都不可能多个任务一块执行,这怎么可能实现,这最多伪异步呀

然而作为一个老手说,都各有各的道理,但结论就是真的实现了异步/并发

实际上上面的问题基本就是对同步、异步、并发、串行、并行不太理解

同步、异步、并发、串行、并行

同步、异步:指的是任务调度时的执行方式

同步:任务调度的时候,一个一个执行我们的任务,严格按照顺序执行

异步:任务调度的时候,一个任务执行,可以无需等待,继续执行另外一个任务

串行、并行:是指任务物理上运行的方式

串行:在一个cpu核心上运行,不管多少个任务,只在一个通道运行,就比如一条水管,不管有没有顺序

并行:在多个cpu核心上运行,可以同时运行多个任务,好比多个水管,支持并行的可以效率大大提升

并发:是一个混合概念,宏观上看在一起跑,微观指多任务交替运行(我们的cpu就是这样的哈,了解到系统原理的应该都知道cpu执行片段的概念,通过不同调整任务优先级执行,保证多个任务都能够得到响应,单核cpu通过复杂的调度逻辑,拥有了单核运行多个程序的能力)

ps:别再扯到线程和进程了,这个和表面的串行和并行也没啥关系哈,只是我们的任务是在线程中运行的,而线程是依托于进程,我们的应用可以拥有一个至多个进程,一个进程可以有多个线程,进程资源相互隔离,线程是共享资源(所以常见的线程通信实际很简单,就是这个道理),就是如此简单

再度解释单线程实现异步、并发

了解了上面几个概念,相信也能大致了解异步、并发本身就和串行不是一回事,实际上,以js来说,以浏览器为例,浏览器给我们的标签页单独起了一个主线程,所以这就是我们说的js单线程

js单线程实现异步、并发,实际上做的事情和cpu一样,js通过promise和timeout等微任务、宏任务,将一个个庞大的任务分割成了无数个小任务,然后通过执行小任务的同时,分割成更多任务到队尾,按照固定的逻辑运行,从而实现了一个个任务交替运行,这本身就实现了异步、并发

虽然我们了解的 promise 的原理,知道了其运行也是有固定顺序的(除了请求和io这种依托浏览器其他线程的,这个等其他线程执行完毕后的通知反馈的操作,是注定无法决定顺序哈)

最后

这个实际的逻辑就是如此简单,就是我们对概念的理解还不够,一旦理解如喝水一般简单了

而对于提效的场景,主要是针对于io、请求、计时器、webwork常见操作,这些操作确实不是在我们的js线程实现的,而是在他们自己的操作线程,提效方面 webwork 实际上才是我们优化提效的真实手段

相关推荐
剪刀石头布啊3 小时前
vue-react为何要虚拟dom
前端
剪刀石头布啊3 小时前
ahooks常用的一些库,我们使用一下
前端
剪刀石头布啊3 小时前
从git更新本地提交记录到更新已经推送到远端记录
前端
Flynt5 小时前
axios 被投毒半年后,我把 npm 的"安全防线"实测了一遍:最信任的 SHA512 是安慰剂
前端·npm·node.js
excel6 小时前
Base62 和 Base64 有什么区别?
前端
风骏时光牛马7 小时前
大模型底层架构与AI源码深度剖析
前端
掘金挖土8 小时前
前端手摸手跑路之 AI 应用开发(九)
前端·后端
中文呀11 小时前
三维 GIS 离线缓存实战:逆向 CesiumOfflineCache,并亲手为它补上"自动更新"能力
前端
前进前进前进11 小时前
TRAE 全链路实战:做了一个警示牌一键生成器:纯 Canvas、单文件、零依赖
前端