JS多线程
更新: 7/21/2025 字数: 0 字 时长: 0 分钟
历史故事
早年间JS被设计成单线程的(这里的单线程指的是单个脚本只能在单个线程/主线程上运行,其他线程都是用来配合主线程的),这是为了简化浏览器而做出的选择,创造者不希望引入锁等一系列复杂的机制。
但是再后来,我们会发现很多的时候IO操作会对单线程的JS造成阻塞,我们去请求五个接口,时间就是五个接口的请求时间的和,而且这个时候CPU是完全空闲的,这是我们绝不期望看到的,于是JS设计者又设计了事件循环机制,用来将等待IO操作的任务先挂起,进行后面的CPU操作,等IO操作结束之后再去将挂起的任务恢复继续进行下去/
再后来多核CPU越来越常见,HTML5提出Web Woker标准,允许JS创建多个线程,但是却收到限制,子线程完全受主线程控制,且不允许进行DOM操作,这一限制可以说让JS的单线程本质保持了下来,所以我们现在仍然可以说JS是一个单线程或者至少说是使用单线程模型的语言。
同步任务和异步任务
JS中所有的任务被分为两类:同步任务和异步任务,其中同步任务是在主线程中阻塞执行的任务,他们以一定的顺序排队完成,而异步任务则是在一旁等待同步任务执行完后的任务,只有引擎认为他们该执行了才会被放到主线程中执行,异步任务后面的代码不用等待营部任务借宿会马上运行。
任务队列和事件循环
JS中存在一个任务队列,这个队列中存放了等待处理的异步任务,等到同步任务全部完成后,主线程就回去看异步任务是否满足执行的条件,如果满足,那么就会被调到主线程中进行执行,等到执行完后在选择下一个可以执行的异步任务来主线程中执行,直到所有的异步任务执行完成。
异步任务通常是以回调函数的形式书写的,没有回调的异步任务是不会进入到主线程中的。