问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

HTML5 Web Worker是利器还是摆设

发布网友 发布时间:2022-04-22 04:25

我来回答

4个回答

热心网友 时间:2022-04-18 14:46

Worker能解决两个问题:解决程序阻塞问题:提升效率。不过Worker还有局限性,它不能操作DOM。解决方法如下:

1、首先在创建之前,检测所用浏览器是否支持它,当前除了IE浏览器以外,其它主流浏览器都是支持的。

2、创建web worker文件:通过postMessage方法向 页面传回一段消息。

3、创建 Web Worker对象:添加一个事件*,传递消息时,执行事件*中的代码。

4、使用terminate方法终止 Web Worker。

5、最后检测是否存在 worker,如果不存在,则创建一个新的对象,然后运行 js代码中的内容。被调用的js文件内容如下。

热心网友 时间:2022-04-18 16:04

  HTML5几个优势特性里,就包括了Web
Worker,这货可以了解为多线程,正常形况下,浏览器执行某段程序的时候会阻塞直到运行结束后在恢复到正常状态,而HTML5的Web
Worker就是为了解决这个问题。

  所以它能解决两个问题:1. 解决程序阻塞问题; 2. 提升效率。

  Worker还有有局限性,它不能操作DOM,目前大多JavaScript应用都在处理DOM,需要耗费非常大性能的运算通常都放Server端了,否则浏览器跑一个累死它的脚本会让它时不时弹出恶心的无响应。

热心网友 时间:2022-04-18 17:39

 html5 web worker使用例子 - https://21xrx.com/full_stack/Html/html5_web_workers.html

热心网友 时间:2022-04-18 19:30

一、关于Web Worker
HTML5几个优势特性里,就包括了Web Worker,这货可以了解为多线程,正常形况下,浏览器执行某段程序的时候会阻塞直到运行结束后在恢复到正常状态,而HTML5的Web Worker就是为了解决这个问题。
所以它能解决两个问题:一、解决程序阻塞问题;二、提升效率。
二、例子
通常测试效率最常用的无非就是fibonacci了,我们也来个fibonacci性能测试。
var start = (new Date()).getTime();
var fibonacci =function(n) {
return n<2 ? n : arguments.callee(n-1) + arguments.callee(n-2);
};
fibonacci(38);
console.log((new Date()).getTime() - start);

console.log打出 4792
每台电脑性能不一样,浏览器不一样可能会有变化,38执行需要接近5s,两次就差不多10s。
fibonacci(38);
fibonacci(38);
// 两次执行需要 9694

我们引入Web Worker,提升效率,缩短运算时差
var start = (new Date()).getTime();

// 实例化一个worker实例,参数必须是一篇JavaScript脚本
var worker = new Worker('worker.js');

// 监听worker通信
worker.addEventListener('message', function(event) {
console.log('Worker result: ' + ((new Date()).getTime() - start));
}, false);

// 向worker post数据
worker.postMessage(38);

var fibonacci =function(n) {
return n<2 ? n : arguments.callee(n-1) + arguments.callee(n-2);
};

// 主页面仅剩一个,另外一个已经转移到worker里执行了
setTimeout(function(){
fibonacci(38);
console.log((new Date()).getTime() - start);
}, 100);

worker.js
var fibonacci =function(n) {
return n<2 ? n : arguments.callee(n-1) + arguments.callee(n-2);
};

self.addEventListener('message', function(event) {
self.postMessage(fibonacci(event.data))
}, false);

执行结果:
5394
script.js:9 Worker result: 5399

三、封装
但如果要连续执行好几个,可不能这样:
worker.postMessage(38);
worker.postMessage(38);
worker.postMessage(38);

因为只是new了一个Worker,所以它会顺序执行:
script.js:26 5369
script.js:9 Worker result: 5374
script.js:9 Worker result: 9960
script.js:9 Worker result: 14557

我们可以同时new多个
var start = (new Date()).getTime();

var fibonacci =function(n) {

// 实例化一个worker实例,参数必须是一篇JavaScript脚本
var worker = new Worker('worker.js');

// 监听worker通信
worker.addEventListener('message', function(event) {
console.log('Worker result: ' + ((new Date()).getTime() - start));
}, false);

// 向worker post数据
worker.postMessage(n);
};

fibonacci(38);
fibonacci(38);
fibonacci(38);

执行结果:
Worker result: 7062
Worker result: 7068
Worker result: 7128

执行4次的结果:
script.js:11 Worker result: 9323
script.js:11 Worker result: 9335
script.js:11 Worker result: 9340
script.js:11 Worker result: 9350

可见实例越多,单个执行效率就越高,因为new一个Worker也是需要耗费时间的,但即使这样也比在浏览器里阻塞顺序执行效率更高。
四、跨域与脚本引入
Worker在实例化的时候必须要传入一个脚本URL,而且必须是在本域下,否则会报跨域错误:
本域:http://localhost:63342/
Code:
var worker = new Worker('http://localhost/worker.js');

报安全错误:
Uncaught SecurityError: Failed to construct 'Worker': Script at 'http://localhost/worker.js' cannot be accessed from origin 'http://localhost:63342'.
但可以在Worker里通过importScripts方法引入任何域下的脚本,就如同HTML里的script标签一样
http://localhost/script.js
console.log('Hello world! from http://localhost/script.js');

worker里引入它
self.importScripts('http://localhost/script.js');

console.log: Hello world! from http://localhost/script.js
new Worker 与 importScripts是异步还是同步呢?做个测试
Python Code
class Worker(tornado.web.RequestHandler):
def get(self):
time.sleep(5)
self.write("""
console.log('From worker');
""")

sleep 5秒,然后再返回,控制台:
script.js:1 start....
script.js:3 end!
worker:2 From worker

没有阻塞,再看看importScripts:
worker.js
self.importScripts('/script1');
self.importScripts('/script2');

Python Code
class Script1(tornado.web.RequestHandler):
def get(self):
time.sleep(5)
self.write("""
console.log('From script1');
""")

class Script2(tornado.web.RequestHandler):
def get(self):
self.write("""
console.log('From script2');
""")

Script1延迟5秒返回,然后console.log还是顺序打印:
start....
end!
From script1
From script2

Timeline:

红色圈处说明了它是顺序加载
五、调试与浏览器支持
再牛*的功能,如果不方便调试也是渣,还好的是chrome里非常容易就能调试

主流浏览器都支持,被人一直唾弃的IE10也都支持了

六、弱点
Worker还有有局限性,它不能操作DOM,目前大多JavaScript应用都在处理DOM,需要耗费非常大性能的运算通常都放Server端了,否则浏览器跑一个累死它的脚本会让它时不时弹出恶心的无响应。
它的API非常少,几乎都能数的出来,说几个非常实用
1、XMLHttpRequest,有了它,才能发出Ajax请求
2、setTimeout/setInterval,js最神奇的地方
3、importScripts,在worker里载入外部js脚本
4、addEventListener/postMessage,有了它们才能与主页互相通信
有些童鞋曾说worker里没有document API,那我从主页获取DOM对象通过postMessage过去。首先,是徒劳的
console会打出:
Uncaught DataCloneError: Failed to execute 'postMessage' on 'Worker': An object could not be cloned.
即使,你很牛*,终于把这个Object传过去了,但那已经是它的一个副本,而不是同一个内存地址了
script
var obj = {};

// 实例化一个worker实例,参数必须是一篇JavaScript脚本
var worker = new Worker('worker.js');

// 向worker post数据
worker.postMessage(obj);

worker.addEventListener('message', function(event){
console.log(event.data === obj);
});

worker.js
self.addEventListener('message', function(event) {
self.postMessage(event.data);
}, false);

console :
false

其实,仔细想想,不能共享DOM也是正常的,否则我这边正在操作DOM,Worker那边也在操作DOM,甚至把DOM删除了,这不是冲突了吗?
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
手机导航地图语音怎么下载 如何分别真金和仿金首饰 怎样区分真金和仿金首饰呢 小学生新年晚会主持人的串词!!(不要太多)急 大大后天就需要了!!!_百度... 周年晚会策划公司 奥格瑞玛传送门大厅在哪 奥格瑞玛传送门大厅怎么走 锻炼颈椎的几个动作 水多久能结冰 冰能在多长时间内形成 请问水低于0度会结冰吗? 如何防止脱发严重 Error #2044: 未处理的 securityError:. text=Erro... 网络/网页无法打开摄像头 电脑一进QQ空间,或者访问什么程序的时候就出现错... 水垢清除剂怎么用? 水垢清洗剂与阻垢缓蚀剂的区别?旭升 请问帕睿斯的水垢清除剂怎么样,能除掉热水器的水... 如何去除玻璃浴房水垢 水垢清洁剂用多了有害处吗 水垢清除剂可以清除牙垢吗? 水管内的水垢怎么清除 水垢清除剂的成分 水垢清除剂怎么用? 电水壶 怎样清除浴室玻璃水垢 除垢剂哪种好 水垢清洗剂配方 水垢去除剂应用范围 水垢去除剂使用方法介绍 水垢清洗剂哪些类型?水垢清除剂有哪些优点? 借款申请成功后多久可以到账? 转3万块人民币多久可以到账 网银转账多久能到账 空间安全沙箱冲突 用jquery给 ifame里面的一个元素加单机事件但是不... abole flash player 重新安装了最新版但是还有问题 ADOBE FLASH10安全沙箱冲突 动态创建的flash在页面与js交互的问题,头大,求助 Adobe Flash Player 10 的错误提示,谁给个简单明... javascript 网页截图 保存为本地图片 adobe flash player 安全沙箱冲突是怎么回事??? 格力空调在运行中,会从制冷自动转换为制热,是什... 空调制冷怎么转换制热 空调开始是制冷过一段时间自动转换制热是什么原因? 空调从制冷或抽湿模式直接换成加热模式会怎样? 空调 自动从制冷模式变成制热模式是什么情况? 空调制冷怎么改成制热? 空调器是如何在制冷和制热之间进行转换的? 菜市场摊位营业执照如何办理 菜市场办理营业执照需要什么材料 菜市场卖菜需要营业执照吗 菜市场统一办理的营业执照为什么没有公章和副本 菜市场的营业执照和店铺的营业执照有什么区别