JS工作者概念

JS 的多线程

一 工作者初识

1.1 工作者概念

JavaScript 的业务代码在浏览器中是以单线程方式运行的,所以 JS 不可能像 Java 那样把工作委托给独立的线程去做,而且 JS 的 DOM API 也会因为多线程执行并发更改出现问题,所以 Java 这种线程模型也不适合 JavaSCript。

浏览器每打开一个页面,其实就会分配一个虚拟的运行环境,这个环境有自己的内存、事件循环、DOM 等。每个页面都是一个独立的沙盒,不会干扰其他页面,而且他们是并行执行的。

新推出的工作者,可以让浏览器在原始页面环境之外再分配一个完全独立的二级子环境。类似线程,这个子环境可以与父环境并行执行代码,但是不能与依赖单线程交互的 API(如 DOM)进行互操作。

1.2 工作者与传统线程比较

工作者与传统执行线程有很多相似的地方:

  • 创建线程的底层核心类似:工作者也是由传统的线程实现的。
  • 都能够在父环境中并行执行代码
  • 都可以共享一些内存:工作者线程能够使用 SharedArrayBuffer 在多个环境间共享内容。

工作者与传统执行线程的区别:

  • 工作者创建开销很大:工作者有自己独立的事件循环、全局对象等 JS 必须的特性,创建开销较大。
  • 工作者不一定在同一个进程:传统情况下,一个进程内部产生多个线程实现并发,但是工作者可能与当前页面属于同一个进程,也可能不属于。例如:Blink 引擎对共享工作者线程和服务工作者线程使用独立的进程。
  • 并发控制不同:传统线程采用锁进行并发控制,JS 采用 Atomics 接口实现并发控制。
  • 工作者不共享所有内存:在传统线程模型中,多线程有能力读写共享内存空间。除了 SharedArrayBuffer 外,从工作者线程进出的数据需要复制或转移。

综合以上发现,工作者线程相对比较重,不是用于替代线程而出现的。工作者线程应该是长期运行的,启动成本比较高,每个实例占用内存也比较大。

1.3 工作者分类

Web 规范定义了多种工作者,主要有三种:

  • 专用工作者:通常简称为工作者线程、Web Worker 或 Worker,是一种实用的工具,可以让脚本单独创建一个 JavaScript 线程,以执行委托的任务,所以其只能被创建它的页面使用。
  • 共享工作者:与专用工作者线程相似,但共享工作者线程可以被多个不同的上下文使用,包括不同的页面。任何与创建共享工作者线程的脚本同源的脚本,都可以向共享工作者线程发送消息或从中接收消息。
  • 服务工作者:与上述二者不同,用于拦截、重定向和修改页面发出的请求,充当网络请求的仲裁者的角色。

1.4 WorkerGlobalScope

工作者环境是没有 window 对象的,其全局对象是 WorkerGlobalScope 的实例,通过 self 关键字获取。

WorkerGlobalScope 属性和方法:

navigator:返回与工作者线程关联的 WorkerNavigator。
self:返回 WorkerGlobalScope 对象。
location:返回与工作者线程关联的 WorkerLocation。
performance:返回(只包含特定属性和方法的)Performance 对象。
console:返回与工作者线程关联的 Console 对象;对 API 没有限制。
caches:返回与工作者线程关联的 CacheStorage 对象;对 API 没有限制。
indexedDB:返回 IDBFactory 对象。
isSecureContext:返回布尔值,表示工作者线程上下文是否安全。
origin:返回 WorkerGlobalScope 的源。

self 对象上暴露的一些方法也是 window 上方法的子集。这些 self 上的方法也与 window 上对应的方法操作一样:

atob()
btoa()
clearInterval()
clearTimeout()
createImageBitmap()
fetch()
setInterval()
setTimeout()
importScripts() // 工作者线程专用

每种类型的工作者线程都使用了自己特定的全局对象,他们继承自 WorkerGlobalScope:

  • 专用工作者线程使用 DedicatedWorkerGlobalScope
  • 共享工作者线程使用 SharedWorkerGlobalScope
  • 服务工作者线程使用 ServiceWorkerGlobalScope
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值