说一说Web Workers是什么及Web Workers有什么用


说一说Web Workers是什么及Web Workers有什么用

文章插图
今天来说一下关于Web Workers是什么及Web Workers有什么用这方面的一些讯息,不少朋友对于Web Workers是什么及Web Workers有什么用这方面的信息颇感兴趣的 。小编今天就为此整理一些相关的讯息,希望对有需要的朋友有所帮助 。
Web Workers 被定义万维网联盟(W3C)和网络超文本应用技术工作组(WHATWG),是一个 JavaScript 的脚本,从执行的 HTML 页面,在运行的背景,独立脚本的可能也已经从同一 HTML 页面执行 。Web worker 通常能够更有效地利用多核 CPU 。
Web Workers
【说一说Web Workers是什么及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 , 此外你还需要通过序列化对象来与线程交互特定的数据 。所以你要是不费点劲儿,还真搞不出错误来 。
以上就是关于Web Workers是什么及Web Workers有什么用这方面的一些信息了 小编整理的这些讯息希望对童鞋们有所帮助