工作者线程种类及用途

/post/workers article cover image

工作者线程简介及用途细节笔记摘要

参考资料

  • <u>《Javascript高级程序设计第4版》第27章</u>

工作者线程与线程

  1. 工作者线程是以实际线程实现的
  2. 工作者线程并行执行
  3. 工作者线程可以共享某些内存
  4. 工作者线程不共享全部内存
  5. 工作者线程不一定在同一个进程里
  6. 创建工作者线程的开销更大

<u>工作者线程相对比较重,不建议大量使用。例如,对一张 400 万像素的图片,为每个像素 都启动一个工作者线程是不合适的。通常,工作者线程应该是长期运行的,启动成本比较高, 每个实例占用的内存也比较大</u>

工作者线程的类型

  1. 专用工作者线程(WebWorker):是一种实用的工具,可以让脚本单独创建一个 JavaScript 线程,以执行委托的任务。专用工作者线程,顾名思义,只能被创建它的页面使用。

  2. 共享工作者线程(SharedWorker):共享工作者线程与专用工作者线程非常相似。主要区别是共享工作者线程可以被多个不同的上下文使用,包括不同的页面。任何与创建共享工作者线程的脚本同源的脚本,都可以向共享工作者线程发送消息或从中接收消息。

  3. 服务工作者线程(ServiceWorkers):服务工作者线程与专用工作者线程和共享工作者线程截然不同。它的主要用途是拦截、重定向和修改页面发出的请求,充当网络请求的仲裁者的角色。

WorkerGlobalScope

  1. 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() WorkerGlobalScope 还增加了新的全局方法 importScripts(),只在工作者线程内可用。
  2. WorkerGlobalScope 的子类:

    • 专用工作者线程使用 DedicatedWorkerGlobalScope。
    • 共享工作者线程使用 SharedWorkerGlobalScope。
    • 服务工作者线程使用 ServiceWorkerGlobalScope。