Web Workers是什么

Fanly 问答 2020-08-30 23:33:49 阅读(...)

Web Workers是一个JavaScript的脚本,从执行的HTML页面,独立脚本的可能也已经从同一HTML页面执行。作用是为JavaScript创造多线程环境,允许主线程创建 Worker 线程,将一些任务分配给后者运行。

Web Workers 被定义万维网联盟(W3C)和网络超文本应用技术工作组(WHATWG),是一个 JavaScript 的脚本,从执行的 HTML 页面,在运行的背景,独立脚本的可能也已经从同一 HTML 页面执行。Web worker 通常能够更有效地利用多核 CPU。

Web Workers

Web Worker 的作用,就是为 JavaScript 创造多线程环境,允许主线程创建 Worker 线程,将一些任务分配给后者运行。在主线程运行的同时,Worker 线程在后台运行,两者互不干扰。等到 Worker 线程完成计算任务,再把结果返回给主线程。这样的好处是,一些计算密集型或高延迟的任务,被 Worker 线程负担了,主线程(通常负责 UI 交互)就会很流畅,不会被阻塞或拖慢。

Worker 线程一旦新建成功,就会始终运行,不会被主线程上的活动(比如用户点击按钮、提交表单)打断。这样有利于随时响应主线程的通信。但是,这也造成了 Worker 比较耗费资源,不应该过度使用,而且一旦使用完毕,就应该关闭。

W3C 和 WHATWG 将 Web Worker 设想为长时间运行的脚本,这些脚本不会被响应点击或其他用户交互的脚本打断。防止此类工作人员受到用户活动的干扰,应该使网页在后台运行长任务的同时保持响应速度。

worker 的最简单用法是执行计算量大的任务,而不会中断用户界面。

Web Worker 为 Web 内容在后台线程中运行脚本提供了一种简单的方法。线程可以执行任务而不干扰用户界面。此外,他们可以使用 XMLHttpRequest 执行 I/O (尽管 responseXML 和 channel 属性总是为空)。一旦创建, 一个 worker 可以将消息发送到创建它的 JavaScript 代码, 通过将消息发布到该代码指定的事件处理程序(反之亦然)。

Web Workers API

一个 worker 是使用一个构造函数创建的一个对象(e.g. Worker()) 运行一个命名的 JavaScript 文件 – 这个文件包含将在工作线程中运行的代码; workers 运行在另一个全局上下文中,不同于当前的 window. 因此,使用 window 快捷方式获取当前全局的范围 (而不是 self) 在一个 Worker 内将返回错误。

在专用 workers 的情况下,DedicatedWorkerGlobalScope 对象代表了 worker 的上下文(专用 workers 是指标准 worker 仅在单一脚本中被使用;共享 worker 的上下文是 SharedWorkerGlobalScope 对象)。一个专用 worker 仅仅能被首次生成它的脚本使用,而共享 worker 可以同时被多个脚本使用。

在 worker 线程中你可以运行任何你喜欢的代码,不过有一些例外情况。比如:在 worker 内,不能直接操作 DOM 节点,也不能使用 window 对象的默认方法和属性。然而你可以使用大量 window 对象之下的东西,包括 WebSockets,IndexedDB 以及 FireFox OS 专用的 Data Store API 等数据存储机制。查看 Functions and classes available to workers 获取详情。

workers 和主线程间的数据传递通过这样的消息机制进行——双方都使用 postMessage()方法发送各自的消息,使用 onmessage 事件处理函数来响应消息(消息被包含在 Message 事件的 data 属性中)。这个过程中数据并不是被共享而是被复制。

只要运行在同源的父页面中,workers 可以依次生成新的 workers;并且可以使用 XMLHttpRequest 进行网络 I/O,但是 XMLHttpRequest 的 responseXML 和 channel 属性总会返回 null。

专用 worker

如前文所述,一个专用 worker 仅仅能被生成它的脚本所使用。这一部分将探讨 专用 worker 基础示例 (运行专用 worker) 中的 JavaScript 代码:将你输入的 2 个数字作乘法。输入的数字会发送给一个专用 worker,由专用 worker 作乘法后,再返回给页面进行展示。

共享 worker

一个共享 worker 可以被多个脚本使用——即使这些脚本正在被不同的 window、iframe 或者 worker 访问。这一部分,我们会讨论共享 worker 基础示例(运行共享 worker)中的 javascript 代码:该示例与专用 worker 基础示例非常相像,只是有 2 个可用函数被存放在不同脚本文件中:两数相乘函数,以及求平方函数。这两个脚本用同一个 worker 来完成实际需要的运算。

关于线程安全

Worker 接口会生成真正的操作系统级别的线程,如果你不太小心,那么并发会对你的代码产生有趣的影响。然而,对于 web worker 来说,与其他线程的通信点会被很小心的控制,这意味着你很难引起并发问题。你没有办法去访问非线程安全的组件或者是 DOM,此外你还需要通过序列化对象来与线程交互特定的数据。所以你要是不费点劲儿,还真搞不出错误来。

0个人收藏 收藏

评论交流

泪雪默认头像 请「登录」后参与评论
  1. 加载中..

相关推荐

  • Web 防火墙 firewall

    Web防火墙有哪些功能

    Web防火墙是一种网络安全技术,具有访问控制、协议过滤、拦截可疑请求、日志记录、反射攻击防护、攻击防护、应用程序防护和审计功能等多种功能,可以有效地保护网络免受未经授权的访问和恶意攻击。
  • Web3.0

    Web2.0与Web3.0的区别是什么

    Web2.0侧重于交互,网络拥有数据,侧重于社区发展,表单是智能应用,是单点故障;Wb3.0侧重于去中心化和语义学习,实体拥有数据的所有权并进行共享,侧重于为用户赋能,表单是智能合约,是无单点故障。
  • 群晖 synology nas

    如何使用WebDAV外网访问群晖NAS文件

    在路由器上做WebDAV相关的端口映射,将5005和5006端口映射到外网;进入套件中心以安装WebDAV Server套件;安装完成后,启动WebDAV Server,并勾选启用HTTP和HTTPS复选框。
  • 安全 Web 网关 Secure Web Gateway

    什么是安全Web网关

    安全Web网关 (SWG) 是一个屏障或检查点,可防止未经授权和潜在的恶意流量进入组织的网络。此屏障可防止威胁性网站病毒、流量和恶意软件访问敏感数据。 网关仅允许某些用户(通常是员工)在获得批准后访问安全网站,同时阻止所有其他网站。
  • 群晖 Synology NAS

    如何通过WebDAV访问群晖NAS

    WebDAV是HTTP协议的扩展,可让用户管理存储在远程服务器上的文件。登录DSM进入套件中心以安装WebDAV Server,启动并勾选启用HTTP和HTTPS复选框,自定义端口号,然后保存设置,然后就可以通过WebDAV访问NAS设备。
  • HTTPS

    Web应用国密改造方案

    我们国家最新发布的信息系统密码应用基本要求(GB/T 39786-2021)中,对密码技术应用的要求分为四大块,分别是:物理和环境的安全、设备和计算的安全、网络和通信的安全、应用和数据的安全。