学习WebWorker
众所周知,js是单线程语言,所有的任务只能在一个线程上完成,尽管为了避免一些耗时很大的任务阻塞执行,js分为同步异步任务,详情请见event loop。随着多核cpu的出现,单线程越来越不能发挥计算机的计算能力。WebWorker正是为js创造多线程的运行环境,一些计算密集或高延迟的任务可以放在后台运行的woker线程上,从而主线程执行流畅。
WebWorker也有使用上的限制:
- WebWorker所依赖的脚本文件必须与主线程同源。
- WebWorker不能操作dom对象,不能访问document,window,parent这些对象。注:可以访问location、navigator。
- 主线程与worker线程不在同一个上下文,需要通过message进行通信。
- WebWorker不能操作本地文件,不可以执行alert(),confirm()方法。
WebWorke使用方法:
一、主线程
注册一个worker线程:
var worker = new Worker('test.js',{name:'testWorker'});
构造函数接受一个脚本文件,要注意的是文件来自服务器!第二个参数接受一个options对象,可以表明当前woker名。
主线程与worker线程通讯通过postMessage方法:
worker.postMessage('from main');
方法接受的参数即为主线程期望传给worker线程的消息,可以为任何类型的值。
主线程通过监听message事件接受worker线程传递过来的消息:
worker.onmessage = function (e) { console.log(e.data); }
事件对象e中的data即为worker传递过来的信息。
主线程可以监听error事件来进行错误处理:
worker.onerror = function (e) { console.log(e); }
只要webworker工作中遇到错误,都会触发主线程的error事件。
在主线程可以通过terminate方法关闭worker线程:
worker.terminate();
二、worker线程
worker线程通过监听message事件获得主线程传递过来的信息:
self.addEventListener('message',function(e) { console.log(e.data); } //同下面两种方法 this.addEventListener('message',function(e) { console.log(e.data); } addEventListener('message',function(e) { console.log(e.data); }
也可以用onmessage监听。
worker线程也使用postMessage方法与主线程通讯。
worker线程可以通过调用onclose方法关闭线程:
self.close();
为了节约系统资源,使用过后必须关闭webworker。
三、加载js脚本
如果worker线程内部需要加载脚本,可以通过importScripts方法导入:
self.importScripts('a.js',....);