web worker 简介

通常,浏览器执行某段程序的时候会阻塞直到运行结束后在恢复到正常状态,而HTML5的Web Worker就是为了解决这个问题。通过worker线程完成密集计算,避免程序的阻塞和页面的卡顿(fps过低)

示例

用fibonacci数列来模拟测试

worker-test.html

<!DOCTYPE html>
<html lang="en"> <head>
<meta charset="UTF-8">
<title>测试 web worker</title>
</head> <body>
<script>
function fibonacci(n) {
return n < 2 ? n : arguments.callee(n - 1) + arguments.callee(n - 2);
} function testNoWorker() {
let start = Date.now();
fibonacci(38);
let end = Date.now();
console.log(end - start); // wait a long time..
} function testUseWorker() {
let start = Date.now();
let worker = new Worker('worker.js');
worker.postMessage(38);
worker.addEventListener('message', function (event) {
let end = Date.now();
console.log('worker result: ', end -start);
});
console.log('can do other jobs, when worker is computing');
} testNoWorker();
testUseWorker();
</script>
</body> </html>

worker.js

function fibonacci(n) {
return n < 2 ? n : arguments.callee(n-1) + arguments.callee(n-2);
} self.addEventListener('message', function (event) {
let result = fibonacci(event.data);
self.postMessage(result);
}); // 可用 setTimeout , setInterval
setTimeout(() => {
console.log('timeout..');
}, 100); setInterval(() => {
console.log('setInterval...');
}, 200); // 可发起ajax
fetch('data.json').then(res => res.json()).then(data => {console.log(data, '<--json data')}); // 可访问 location, navigator
console.log(location);
console.log(navigator); // worker.js的执行上下文为 self (worker实例),
// self上的属性和方法可直接调用
console.log(typeof addEventListener);
console.log(typeof postMessage);

假设主页面需要多次执行耗时的操作(如: fibonacci), 可如下用worker来异步执行.

<!DOCTYPE html>
<html lang="en"> <head>
<meta charset="UTF-8">
<title>测试 实例化多个 web worker</title>
</head> <body>
<script>
function fibonacci(n) {
let start = Date.now();
let worker = new Worker('worker.js'); worker.addEventListener('message', function (event) {
let end = Date.now();
console.log('worker result: ', end - start);
});
worker.postMessage(n);
} /* 同时跑多个worker, 会降低每个worker线程的性能;但总比阻塞页面要好 */
fibonacci(38);
console.log('after one'); fibonacci(38);
console.log('after two'); fibonacci(38);
console.log('after three'); console.log('can handle other jobs..'); </script>
</body> </html>

跨域与脚本引入

在主页面实例化worker, new Worker('/url/to/worker.js') worker脚本必须和主页面同域;在worker脚本中,可以 self.importScripts('url/to/script.js') 导入任何域的脚本, 多个 self.importScripts() 是顺序同步加载的

worker的方法

  • worker.terminate() 终止worker线程

限制

  • 不能访问主页面的全局变量和函数,没有 window, document; 但可访问 location, navigator
  • 支持setTimeout, setInterval, 可发起ajax
  • worker不能访问和操作dom
  • postMessage传的数据都会被复制,不会指向同一个内存地址

web worker 简介的更多相关文章

  1. JS线程模型&Web Worker

    js线程模型 客户端javascript是单线程,浏览器无法同时运行两个事件处理程序 设计为单线程的理论是,客户端的javascript函数必须不能运行太长时间,否则会导致web浏览器无法对用户输入做 ...

  2. Web Worker

    写在前面 众所周知,JavaScript是单线程的,JS和UI更新共享同一个进程的部分原因是它们之间互访频繁,但由于共享同一个进程也就会造成js代码在运行的时候用户点击界面元素而没有任何响应这样的情况 ...

  3. 深入HTML5 Web Worker应用实践:多线程编程

    HTML5 中工作线程(Web Worker)简介 至 2008 年 W3C 制定出第一个 HTML5 草案开始,HTML5 承载了越来越多崭新的特性和功能.它不但强化了 Web 系统或网页的表现性能 ...

  4. 深入 HTML5 Web Worker 应用实践:多线程编程

    深入 HTML5 Web Worker 应用实践:多线程编程 HTML5 中工作线程(Web Worker)简介 至 2008 年 W3C 制定出第一个 HTML5 草案开始,HTML5 承载了越来越 ...

  5. web worker的介绍和使用

    目录 简介 Web Workers的基本概念和使用 Web Workers的分类 worker和main thread之间的数据传输 简介 什么是web worker呢?从名字上就可以看出,web w ...

  6. JavaScript多线程之HTML5 Web Worker

    在博主的前些文章Promise的前世今生和妙用技巧和JavaScript单线程和浏览器事件循环简述中都曾提到了HTML5 Web Worker这一个概念.在JavaScript单线程和浏览器事件循环简 ...

  7. Web Worker javascript多线程编程(一)

    什么是Web Worker? web worker 是运行在后台的 JavaScript,不占用浏览器自身线程,独立于其他脚本,可以提高应用的总体性能,并且提升用户体验. 一般来说Javascript ...

  8. Web Worker javascript多线程编程(二)

    Web Worker javascript多线程编程(一)中提到有两种Web Worker:专用线程dedicated web worker,以及共享线程shared web worker.不过主要讲 ...

  9. 过段时间逐步使用HTML5新增的web worker等内容

    想来快2017年了,2013年前的手机应该很少有人用了,以后逐渐使用HTML5新增的高级API吧. 先把web worker的内容再熟悉一下,因为微软虚拟学院的'面向有经验开发人员的 JavaScri ...

随机推荐

  1. MySql中drop、truncate、delete的区别

    1.drop:能对table和view 用法:  drop table [is exists] 表1,表2,表3....: ①drop是DDL中删除表的操作,会删除表结构和所有数据,并释放空间. ②并 ...

  2. Yii2 数据库sql查询

    Yii2.0 对数据库 查询的一些简单的操作 User::find()->all(); //返回所有数据: User::findOne($id); //返回 主键 id=1 的一条数据(举个例子 ...

  3. 3ds max学习笔记(十六)-- 摄像机

    摄像机添加以及应用技巧:可以更改观察的视点和空间广阔,模拟景深和运动模糊效果: 1,添加:更改观察的角度和位置,增加场景透视感: 基本操作: 景深:

  4. python-猜数字小练习

    isdigit的使用方法,只能对str类型的适用,判断输入的字符串里面是不是仅由数字组成: 本次在写这个小程序时踩到的坑:1.int类型和字符串类型不可以做比较:2.在input下面对guess做了类 ...

  5. java内部类(一)

    内部类(一) 一.定义: 内部类就是定义在另一个类内部的类,与之对应,包含内部类的类就是外部类. 二.作用: 1.内部类提供更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包之中的其他类访问该类 ...

  6. 问题9:tabtle 整理

    合并“行”单元格: <th colspan="2">Telephone</th> 合并“列”单元格: <th rowspan="2" ...

  7. React组件间的通信

    1.子组件调用父组件,采用props的方式进行调用和赋值,在父组件中设置相关属性值或者方法,子组件通过props的方式进行属性赋值或者方法调用: 2.父组件调用子组件,采用refs的方式进行调用,需要 ...

  8. std::vector push_back报错Access violation

    C/C++ code   ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 #include < ...

  9. js正则提取数字小数,提取中文,提取英文

    var value="污染物:PM2.5"; //提取中文 console.log(value.replace(/[^\u4E00-\u9FA5]/g,'')); //提取英文 c ...

  10. eclipse项目名称后面括号里的名称和项目名称不一样

    解决方案: 1:项目右键-属性(Properties)-Web Project Setting, 改名称注意:这个名字将成为你在浏览器访问的路径 2:打开项目目录的.setting文件夹,随便一个文本 ...