前言
理解并发和并行对于理解 js 的单线程架构还是很有帮助的。
并发
当有多个进程在操作时,如果系统只有一个CPU,则它根本不可能真正同时进行一个以上的进程,它只能把CPU运行时间划分成若干个时间段,再将时间 段分配给各个进程执行,在一个时间段的进程代码运行时,其它进程处于挂起状态。这种方式我们称之为并发(Concurrent)。
并发,在操作系统中,是指一个时间段中有几个程序都处于 已启动运行 到 运行完毕 之间,且这几个程序都是在同一个处理机(同一个CPU)上运行,但任一个时刻点上只有一个程序在处理机上运行。
并行
并行是指 “并排行走” 或 “同时实行或实施”。
在操作系统中是指,一组程序按独立异步的速度执行,无论从微观还是宏观,程序都是一起执行的。对比地,并发是指:在同一个时间段内,两个或多个程序执行,有时间上的重叠(宏观上是同时,微观上仍是顺序执行)。
使用 setTimeout 并发执行 js
所以微观上说,多核CPU可以同时执行多个进程,进程数与CPU核数相当。但宏观上说,由于CPU会分时间片执行多个进程,所以实际执行进程个数会远多于CPU核数。
相对于 js 的单线程框架来讲,如果有一个长时任务阻塞了 I/O 或 渲染,可以将它拆分成若干个子任务并发执行。请看下面这个例子:
上述代码使用 setTimeout 将 count 拆成了若干个子任务,浏览器的定时器线程会将 setTimeout 中的回调加入事件队列,等待 执行栈 空闲才会执行,所以它不会阻塞渲染,也不会阻塞I/O事件,解决了同步代码阻塞的问题。有兴趣的小伙伴可以注释掉 setTimeout, 试试同步代码和微任务代码。
从另一个角度来讲,setTimeout 并发执行了 count 的子任务。