引言
js单线程确实实现了异步/并发么,确实是实现了
初入者可能会觉得,这是自然的,异步同步,多自然呀,这就是实现了,而学医了解过一段时间的人可能会觉得,一个单线程,无论如何都不可能多个任务一块执行,这怎么可能实现,这最多伪异步呀
然而作为一个老手说,都各有各的道理,但结论就是真的实现了异步/并发
实际上上面的问题基本就是对同步、异步、并发、串行、并行不太理解
同步、异步、并发、串行、并行
同步、异步:指的是任务调度时的执行方式
同步:任务调度的时候,一个一个执行我们的任务,严格按照顺序执行
异步:任务调度的时候,一个任务执行,可以无需等待,继续执行另外一个任务
串行、并行:是指任务物理上运行的方式
串行:在一个cpu核心上运行,不管多少个任务,只在一个通道运行,就比如一条水管,不管有没有顺序
并行:在多个cpu核心上运行,可以同时运行多个任务,好比多个水管,支持并行的可以效率大大提升
并发:是一个混合概念,宏观上看在一起跑,微观指多任务交替运行(我们的cpu就是这样的哈,了解到系统原理的应该都知道cpu执行片段的概念,通过不同调整任务优先级执行,保证多个任务都能够得到响应,单核cpu通过复杂的调度逻辑,拥有了单核运行多个程序的能力)
ps:别再扯到线程和进程了,这个和表面的串行和并行也没啥关系哈,只是我们的任务是在线程中运行的,而线程是依托于进程,我们的应用可以拥有一个至多个进程,一个进程可以有多个线程,进程资源相互隔离,线程是共享资源(所以常见的线程通信实际很简单,就是这个道理),就是如此简单
再度解释单线程实现异步、并发
了解了上面几个概念,相信也能大致了解异步、并发本身就和串行不是一回事,实际上,以js来说,以浏览器为例,浏览器给我们的标签页单独起了一个主线程,所以这就是我们说的js单线程
js单线程实现异步、并发,实际上做的事情和cpu一样,js通过promise和timeout等微任务、宏任务,将一个个庞大的任务分割成了无数个小任务,然后通过执行小任务的同时,分割成更多任务到队尾,按照固定的逻辑运行,从而实现了一个个任务交替运行,这本身就实现了异步、并发
虽然我们了解的 promise 的原理,知道了其运行也是有固定顺序的(除了请求和io这种依托浏览器其他线程的,这个等其他线程执行完毕后的通知反馈的操作,是注定无法决定顺序哈)
最后
这个实际的逻辑就是如此简单,就是我们对概念的理解还不够,一旦理解如喝水一般简单了
而对于提效的场景,主要是针对于io、请求、计时器、webwork常见操作,这些操作确实不是在我们的js线程实现的,而是在他们自己的操作线程,提效方面 webwork 实际上才是我们优化提效的真实手段