学会后教给你同事,js中的十贰线程

     
因为下个类型中要用到部分倒计时的效益,所以就提前策画了弹指间,省的到时候出现转手分界面不和谐和局地别样的作业。正好趁着那几个空子也强化一下html5中的二拾八线程worker的用法和精晓。

WebWorker类似于浏览器中的四线程操作。从前的JS中,无论你是运用setTimeout、setInterval
照旧使用了XMLHttpRequest,都以在3个线程里面。前多少个应用音讯队列,XMLHttpRequest则是浏览器会帮你进行闲时实行。百川归海,都是在3个线程里面跑。假如用户想实香港行政局地不通操作,很可能会发出鸿沟页面包车型客车场地。以至于我们想落成二个类似于Android的专用、公用Service,那该如何做?

Html5之web workers多线程

Web Workers 是 HTML5提供的3个javascript二拾10二线程解决方案,大家可以将有些大计算量的代码交由web
Worker运转而不冻结用户分界面。

1、首先看三个实例:

1)js文件(test.js)

 

var fibonacci =function(n) {
    return n <2? n : arguments.callee(n -1) + arguments.callee(n -2);
};
onmessage =function(event) {
    var n = parseInt(event.data, 10);
    postMessage(fibonacci(n));
};

2)html页面(test.html)

 

 

<script type=text/javascript>|r| var worker =new
Worker(‘test.js’); |r| worker.onmessage =function(evt){ |r|
alert(evt.data);|r| }|r| function onload() {|r|
worker.postMessage(40);|r| }|r| onload();|r|
</script>sfsdfdsfdsfdfdsf

 

注意:

 

一.下边的例子最佳放置服务器上运转。(chrome不辅助地方的)

二.下边包车型地铁例子能够开采,页面会先渲染body中的html内容,在子线程中去实践担任的计量,等子线程总括结束后把结果传递给主线程。假设不行使web
workers,直接把计算部分放到主线程中,那么浏览器处于单线程中,会相继推行,导致上边包车型客车页面不可能加载。

2、web workers流程:

 

WEB主线程:
1.透过 worker = new Worker( url )
加载四个JS文件来创立二个worker,同时重临三个worker实例。
贰.透过worker.postMessage( data ) 方法来向worker发送数据。
叁.绑定worker.onmessage方法来接过worker发送过来的数额。
四.方可运用 worker.terminate() 来终止三个worker的举办。

worker新线程:
壹.因而postMessage( data ) 方法来向主线程发送数据。
2.绑定onmessage方法来收纳主线程发送过来的多寡。

3、web workers知识点:
1.worker.onmessage
绑定主线程的message事件,当worker调用postMessage时艺术时,绑定的事件管理程序会被调用到,传递来的数额足以接纳Mouse伊芙nt的data属性获取,通过target属性仍可以取得worker对象

2.self是什么
self是woker中对本人的引用,有个别像this

3.close()
在worker内部调用close()方法效果和在表面调用worker实例的terminate()方法效果一样,终止worker运维

4.onmessage
在那个句柄内接收外部调用者传递的参数,参数能够通过e.data获取

5.self.postMessage()
没有错通过那一个格局我们得以在worker内把结果传递给主线程,主线程上绑定的message事件的管理程序会被调。

6.全新的JavaScript环境
当1个Worker实例被创制的时候,它会在三个簇新的JavaScript运转情形中,完全和创建worker的本子分离开,固然大家传递的新闻是引用类型它们也是复制传递的,修改worker中的参数不影响创制脚本中的参数。

7.importScripts()
我们得以经过importScripts()方法通过url在worker中加载库函数,如下:
importScripts(‘utility/dialog.js’,’common/cookie.js’);
方法能够承受四个url,相对地址的url以当下worker为参照,方法会根据参数顺序依次下载运转库函数,假若中间有个别脚本出错,剩下的都不会被载入和进行,而且以此形式是同台的,唯有具备脚本都加载、运维完后才会重返。
注:importScripts方法能够加载跨域的文件。使用worker的构造函数时的js文件只可以是同源的。

8.worker施行模型
worker线程从上到下同步运营它的代码,然后进入异步阶段来对事件及机械漏刻响应,假使worker注册了message事件管理程序,只要其有望接触,worker就一贯在内部存款和储蓄器中,不会脱离,但要是worker没有监听音信,那么当有着职分实践完毕(包蕴计数器)后,他就能够退出。

玖.web worker中能够运用什么
壹)self自个儿引用
二)能够使用JavaScript的大局对象:JSON、Date()、Array
叁)location对象,不过其属性都以只读的,改了也潜移默化不到调用者
4)navigator对象
5)setTimeout()、setInterval()及其对应去掉方法
6)addEventListener()、removeEventListener()
7)最终web worker还支持sub
worker和共享worker,那方面平昔不太仔细看,浏览器兼容性也不讨理想,有意思味同学能够上网搜索研究一下。

10.web worker 弱点:
一)在worker中不可能应用window对象和docuemnt对象(dom对象),即:不能够在主、子线程中共享dom操作。
二)不能够跨域加载work的js(在动用work的构造方法时)
三)web
worker只好用来加载同域下的json数据,而那上头ajax已经能够做到了,而且功效越来越高更通用。依然让Worker做它和煦擅长的事呢。

 

workers多线程 Web Workers 是 HTML五提供的二个javascript102线程化解方案,咱们得以将有些大总计量的代码交由web
Worker运行而不冻结用户…

正文由云+社区公布

Worker简介

    JavaScript
语言应用的是单线程模型,也正是说,全体职务只可以在几个线程上成功,二次只可以做一件事。后边的任务没做完,前面包车型地铁职务只好等着。这几个都是我们所公知的。不过随着事情的随地追加,只是独自的单线程形式已经或然无法满意大家的须求了。于是在html5中新扩展了后台职务worker
API。

w叁c中的介绍:web worker 是运作在后台的
JavaScript,独立于任何脚本,不会影响页面包车型客车属性。您可以持续做其余愿意做的职业:点击、选用内容等等,而此时
web worker 在后台运行。

       worker正是为了JavaScript 创设三十二线程意况,允许主线程创立 Worker
线程,将部分任务分配给后人运转。开启后台线程,在不影响前台线程的前提下做一些耗费时间还是异步的操作。因为是例外的线程,所以主线程与worker线程互不干扰。也不会相互打断。所以在部分情形能够加强页面包车型大巴流程性。Worker
线程一旦新建成功,就能平昔运作,不会被主线程上的运动(举个例子用户点击按键、提交表单)打断。那样便于随时响应主线程的通讯。可是,那也形成了
Worker 比较花费能源,不应有过度使用,而且若是选取落成,就应当关闭。

1.Web Worker是什么

JavaScript
语言使用的是单线程模型,也正是说,全数任务只可以在二个线程上到位,叁回只可以做1件事。前边的天职没做完,前面的任务只可以等着。随着Computer计量技术的增长,尤其是多核
CPU 的产出,单线程带来非常的大的紧巴巴,无法丰裕发挥Computer的测算才能。

接纳规则

  1. 不可能差异源:也正是说js文件的门径必须和主线程的脚本同源。幸免了外部引用。
  2. dom限制:在worker线程中无法操作dom(document,window,parent)。注意能够采纳浏览器的navigator和location对象。
  3. 广播发表限制:worker线程和主线程不在一个内外文中所以不可能直接通信。也正是说主线程定义的变量在worker中也是不可能利用的。全部只可以通过消息实现。
  4. 提示禁止:worker线程无法alert和confirm,这一个不知到实际原因?
  5. 传值dom:实行新闻报纸发表也无法传值dom只可以是变量。
  6. ie限制:ie9不可能采纳!ie九无法选拔!ie玖不可能选用!

Web Worker 是HTML伍专门的职业的壹局部,那1专门的工作定义了1套
API,它同意1段JavaScript程序运营在主线程之外的此外二个线程中。Web
Worker 标准中定义了两类专门的学问线程,分别是专用线程Dedicated
Worker和共享线程 Shared Worker,其中,Dedicated
Worker只好为三个页面所接纳,而Shared
Worker则足以被多个页面所共享,本文示例为专用线程Dedicated Worker。

澳门葡京 1img

worker文档

Web Workers
API的Worker分界面代表了叁个得以轻便创制的后台职责,能够将音讯发送回其成立者。创设worker就好像调用 构造函数并内定要在办事线程中运转的剧本同样简单。

chrome浏览器是多进度架构,分为Browser进度以及Render进度。每张开3个页面,浏览器都会为其分配多少个Render进度,webkit以及js都运转在这些历程内。假使要起1个DedicatedWorker,Chrome会在Render进度中起二个线程。即使要起多少个SharedWorker就有些复杂一点,必须起四个专门的长河,并且,一样的SharedWorker不管你创制多少次,都只设有多少个。

Web Worker 的成效,正是为 JavaScript 创制四线程情况,允许主线程创建Worker 线程,将某些职分分配给子孙后代运转。在主线程运营的同时,Worker
线程在后台运转,两者互不苦恼。等到 Worker
线程完结总括职分,再把结果重返给主线程。那样的收益是,一些计量密集型或高延迟的天职,被
Worker 线程担负了,主线程(经常担负 UI
交互)就能够很流利,不会被卡住或拖慢。

构造函数

worker():创立三个专用的Web
worker,在钦点的U牧马人L上施行脚本。示例:var worker=new
Worker(‘js/setTime.js’);

二.使用Dedicated Worker的主页面代码main.js

Worker
线程壹旦新建成功,就能一直运作,不会被主线程上的移动(比方用户点击按键、提交表单)打断。那样便于随时响应主线程的通讯。然而,这也致使了
Worker 相比成本财富,不应当过度使用,而且1旦采取达成,就活该关闭。

属性

学会后教给你同事,js中的十贰线程。onerror:

那是叁个在error事件时有发生时调用的函数,并且通过该函数冒泡worker。示例:worker.onerror=function(){….};

onmessage:

  那是多少个worker中message事件要产生的时候调用的风浪。 
示例:worker.onmessage=function(){….};

 
这几个事件一般与postMessage事件同时利用,多个用来发送数据,3个用来经受多少。比方:

 主线程中:

  var jsId = "00001";
  var worker = new Worker('js/setTime.js');
  worker.postMessage(jsId);

 

         worker线程中:

//接受事件参数
onmessage = function(e) {

    console.log(e.data[0])
}

如此就产生了1个主线程向worker线程传递参数的长河。同样假如worker线程要向主线程传递参数反过来写就可以。

 onmessageerror:

在音信传递进程出现谬误的属性事件。示例:worker.onmessageerror=function(){….};

var worker = new Worker("task.js");
worker.postMessage(
{
  id:1,
  msg:'Hello World'
}
);
worker.onmessage=function(message){
  var data = message.data;
  console.log(JSON.stringify(data));
  worker.terminate();
};
worker.onerror=function(error){
  console.log(error.filename,error.lineno,error.message);
}

Web Worker 有以下多少个应用注意点。

方法

postMessage:

向线程worker的中间范围发送新闻,能够安装参数,发送给worker线程的数据。在onmessage中接受。

terminate:

过多的拉开worker线程异常浪费能源所以在动用今后能够告1段落它,终止方法运用terminate()。示例:worker.terminate();

close:

除了上边包车型大巴闭馆,借使是在worker线程本身也能够运用self.close()关闭。

Dedicated Worker所试行的代码task.js

同源限制

 机械漏刻示例

地方说了那么多都以介绍worker的片段骨干本性可能措施的运用。上面通过切实的言传身教来看效果。

咱们就拿最常用的倒计时来做示范表达。异常的粗略的1个事例。我们在业务中时时遭受倒计时业务,在倒计时的时候还要做一些其余的作业。因为js单线程的特点,你会发觉你的倒计时在您进行别的业务操作的时候是搁浅了的。举例未来是九:伍7您进行了三秒的事体管理。等事情管理完毕应该是:9:5四,可是你的倒计时如故九:五7.就很让人侧目标求证了那1个光景。

onmessage = function(message){
  var data=message.data;
  data.msg = 'Hi from task.js';
  postMessage(data);
}

分红给 Worker 线程运营的本子文件,必须与主线程的本子文件同源。

现象业务设计

这正是说大家今天布置那样2个专业操作,

  • 第壹大家页面有1个计时器和三个事务操作开关(用来效仿耗费时间的操作)。
  • 下一场把电火花计时器写到2个worker中开始展览倒计时操作。
  • 谈到底通过音信报导把每便的倒计时时间发送给主线程让主线程修改显示时间。
  • 告竣倒计时甘休结束反应计时器和线程

 有人大概会说怎么还要回到主线程修改时间展现值,请看一下方面包车型客车采纳规则,作者自然也是希图张开主线程传值dom给worker线程奈何不行只可以在回传回来。

在main.js代码中,首先通过调用构造函数,传入了worker脚本文件名,新建了2个worker对象,在自身的明亮中,那一对象是新创建的做事线程在主线程的引用。随后调用worker.postMessage()方法,与新成立的行事线程通讯,这里流传了二个json对象。随后分别定义了worker对象的onmessage事件和onerror事件的回调解和管理理函数,当woker线程重回数据时,onmessage回调函数推行,数据封装在message参数的data属性中,调用
worker 的
terminate()方法能够告一段落worker线程的运营;当worker线程施行出错时,onerror回调函数试行,error参数中封装了错误对象的文本名、出错行号和求实错误新闻。

DOM 限制

代码体现

 Html代码:

<body>
        <div>
            10 :
            00
        </div>

        <button type="button" onclick="business()">耗时操作</button>
 </body>

主线程js代码:

            //页面加载完成后初始化
            window.onload = function() {
                //创建定时器线程
                var worker = new Worker('js/setTime.js');
                //获取dom对象
                var domMinute_p = document.getElementById('Minute_p');
                var domSecond_p = document.getElementById('Second_p');
                worker.postMessage(600);

                //这里可以接受worker线程的返回值
                worker.onmessage = function(event) {
                    var totalSecond = event.data;
                    console.log(totalSecond)
                    //计算分钟数
                    var minute_p = parseInt(totalSecond / 60);
                    domMinute_p.innerText = minute_p;
                    //计算秒数
                    var second_p = parseInt(totalSecond % 60);
                    domSecond_p.innerText = second_p;
                }
            }
            //这里是模拟的耗时操作
            function business() {
                var data = [1, 2, 3, 4, 5];
                for(var i = 1; i < 1000; i++) {
                    for(var j = 1; j < 1000; j++) {
                        for(var k = 1; k < 5000; k++) {
                            var b = k * 100;
                        }
                    }
                }
                console.log("业务终于走完了!")
            }

worker线程js代码:

var totalSecond = 600;
var domMinute_p, domSecond_p,

    //接受事件参数
    onmessage = function(e) {
        console.log(e.data)
        domMinute_p = e.data;
    }
var timeId = setInterval(function() {
    totalSecond--;

    if(totalSecond == 0) {
        self.close();
    }
    console.log(totalSecond)
    postMessage(totalSecond)

}, 1000)

好了差不多示例正是这么多。上面是截图效果:

澳门葡京 2

 开端运转后编号壹会初叶倒计时,不过当你点击了号码2举办了模拟耗费时间后,编号一仍旧会堵塞,唯有完结编号二后才会运转,不过不一样与地方提起的单线程是,他再也运维时的岁月是不错开上下班时间间,依然刚刚的例证假若是九:伍七,点击编号贰模拟耗时了3秒,耗时实现后编号一会展现玖:5四而不是单线程的玖:57。就印证worker今后在耗费时间操作的时候是时时各处运作的,时间卡只可是是主线程的dom操作被卡住了而已(能够把耗费时间事情也拉开worker就不卡住了)。这里只是介绍worker的应用,全部就不纠结这一个分界面彰显的主题素材。

 

 

在task.js代码中,定义了onmessage事件管理函数,由主线程传入的数据,封装在message对象的data属性中,数据管理到位后,通过postMessage方法成功与主线程通讯。在做事线程代码中,onmessage事件和postMessage方法在其全局功效域能够访问。

Worker 线程所在的全局对象,与主线程差别,不可能读取主线程所在网页的 DOM
对象,也无能为力运用documentwindowparent这一个目的。可是,Worker
线程能够navigator对象和location对象。

三.worker线程施行流程

通讯联系

经过翻看资料,webKit加载并实行worker线程的流水生产线如下图所示

Worker
线程和主线程不在同贰个上下文景况,它们不可能一向通讯,必须经过信息实现。

澳门葡京 3

剧本限制

Paste_Image.png

Worker 线程不能够实施alert()方法和confirm()措施,但能够运用
XMLHttpRequest 对象发出 AJAX 请求。

  1. worker线程的创制的是异步的

文件限制

代码实施到”var worker = new
Worker(task.js’)“时,在基本中构造WebCore::JSWorker对象(JSBbindings层)以及相应的WebCore::Worker对象(WebCore模块),根据起头化的url地址”task.js”发起异步加载的流水生产线;主线程代码不会堵塞在此处守候worker线程去加载、推行内定的台本文件,而是会即时向下继续推行前面代码。

Worker
线程不可能读取当半夏件,即不能够开垦本机的文件系统(file://),它所加载的台本,必须来自网络。

  1. postMessage新闻交互由基础调节

2.1 主线程

主线程采取new命令,调用Worker()构造函数,新建多少个 Worker 线程。

var worker = new Worker(‘work.js’);

Worker()构造函数的参数是三个剧本文件,该公文就是 Worker
线程所要实行的职务。由于 Worker
不能够读取当半夏件,所以那一个本子必须来自网络。要是下载未有马到功成,Worker
就能够默默地退步。

然后,主线程调用worker.postMessage()方法,向 Worker 发消息。

worker.postMessage(‘Hello World’); worker.postMessage({method: ‘echo’,
args: [‘Work’]});

worker.postMessage()办法的参数,便是主线程传给 Worker
的数额。它能够是各类数据类型,包含贰进制数据。

随之,主线程通过worker.onmessage钦点监听函数,接收子线程发回来的新闻。

worker.onmessage = function { console.log(‘Received message ‘ +
event.data); doSomething(); } function doSomething() { // 奉行任务worker.postMessage(‘Work done!’); }

下边代码中,事件目的的data属性能够博得 Worker 发来的多少。

Worker 落成职责之后,主线程就能够把它关掉。

worker.terminate();

main.js中,在成立woker线程后,登时调用了postMessage方法传递了数码,在worker线程还没创制完结时,main.js中发出的音信,会先存款和储蓄在三个临时新闻队列中,当异步成立worker线程达成,权且音讯队列中的新闻数据复制到woker对应的WorkerRunLoop的新闻队列中,worker线程开端拍卖音信。在通过壹轮新闻来回后,继续通讯时,
那个时候因为worker线程已经创立,所以音信会直接助长到WorkerRunLoop的音讯队列中;

2.2 Worker 线程

Worker 线程内部须要有3个监听函数,监听message事件。

self.addEventListener(‘message’, function { self.postMessage(‘You
said: ‘ + e.data); }, false);

下边代码中,self代表子线程本身,即子线程的大局对象。因而,等同于下边三种写法。

// 写法一 this.addEventListener(‘message’, function {
this.postMessage(‘You said: ‘ + e.data); }, false); // 写法二
addEventListener(‘message’, function { postMessage(‘You said: ‘ +
e.data); }, false);

而外行使self.addEventListener()内定监听函数,也能够利用self.onmessage点名。监听函数的参数是多少个事变目的,它的data品质包涵主线程发来的多寡。self.postMessage()办法用来向主线程发送新闻。

根据主线程发来的数额,Worker 线程能够调用分裂的诀要,上边是三个例证。

self.addEventListener(‘message’, function { var data = e.data; switch
{ case ‘start’: self.postMessage(‘WORKER STARTED: ‘ + data.msg);
break; case ‘stop’: self.postMessage(‘WORKER STOPPED: ‘ + data.msg);
self.close(); // Terminates the worker. break; default:
self.postMessage(‘Unknown command: ‘ + data.msg); }; }, false);

位置代码中,self.close()澳门葡京 ,用于在 Worker 内部关门自己。

四.worker线程数据通信情势

二.3 Worker 加载脚本

Worker 内部假如要加载其余脚本,有2个专程的秘技importScripts()

importScripts(‘script1.js’);

该措施能够而且加载多个剧本。

importScripts(‘script1.js’, ‘script2.js’);

主线程与子线程数据通讯格局有二种,通讯内容,能够是文本,也得以是目的。必要小心的是,那种通讯是拷贝关系,便是传值而不是地点,子线程对通讯内容的改变,不会影响到主线程。事实上,浏览器内部的运维机制是,先将通信内容串行化,然后把串行化后的字符串发给子线程,后者再将它过来。

二.4 错误管理

主线程能够监听 Worker 是不是发生错误。要是爆发错误,Worker
会触发主线程的error事件。

worker.onerror(function { console.log([ ‘ERROR: Line ‘, e.lineno, ‘
in ‘, e.filename, ‘: ‘, e.message ].join; // 或者
worker.addEventListener(‘error’, function { // … });

Worker 内部也足以监听error事件。

主线程与子线程之间也能够换来二进制数据,比如File、Blob、ArrayBuffer等对象,也得以在线程之间发送。然则,用拷贝形式发送二进制数据,会导致品质难题。举个例子,主线程向子线程发送1个50MB文件,默许景况下浏览器会变卦1个原版的书文件的正片。为了减轻那个主题素材,JavaScript允许主线程把2进制数据直接转移给子线程,转移后主线程不能够再采用那个数据,那是为了制止出现七个线程同时修改数据的主题材料,那种转移数据的方法,叫做Transferable
Objects。

2.5 关闭 Worker

采纳达成,为了省去系统能源,必须关闭 Worker。

// 主线程 worker.terminate(); // Worker 线程 self.close();

前方说过,主线程与 Worker
之间的通讯内容,可以是文件,也能够是目的。必要专注的是,那种通讯是拷贝关系,正是传值而不是传址,Worker
对通讯内容的退换,不会潜移默化到主线程。事实上,浏览器内部的运营机制是,先将通信内容串行化,然后把串行化后的字符串发给
Worker,后者再将它过来。

主线程与 Worker 之间也得以调换二进制数据,比如 File、Blob、ArrayBuffer
等项目,也足以在线程之间发送。下边是三个事例。

// 主线程 var uInt8Array = new Uint8Array(new ArrayBuffer; for (var i
= 0; i < uInt8Array.length; ++i) { uInt8Array[i] = i * 2; //
[0, 2, 4, 6, 8,…] } worker.postMessage(uInt8Array); // Worker 线程
self.onmessage = function { var uInt8Array = e.data;
postMessage(‘Inside worker.js: uInt8Array.toString() = ‘ +
uInt8Array.toString; postMessage(‘Inside worker.js:
uInt8Array.byteLength = ‘ + uInt8Array.byteLength); };

然而,拷贝形式发送2进制数据,会促成品质难题。比方,主线程向 Worker
发送二个 500MB
文件,暗中同意意况下浏览器会转移叁个原著件的正片。为了缓慢解决那些难点,JavaScript
允许主线程把2进制数据直接转移给子线程,不过只要改变,主线程就不可能再利用那一个2进制数据了,那是为着幸免出现四个线程同时修改数据的麻烦局面。这种转移数据的章程,叫做Transferable
Objects。那使得主线程能够便捷把数据交由
Worker,对于影象管理、声音管理、3D
运算等就1贰分便宜了,不会产生品质负担。

假若要直接转移数据的调控权,即将动用上边包车型地铁写法。

// Transferable Objects 格式 worker.postMessage(arrayBuffer,
[arrayBuffer]); // 例子 var ab = new ArrayBuffer;
worker.postMessage;

常常意况下,Worker 载入的是一个独门的 JavaScript
脚本文件,可是也足以载入与主线程在同1个网页的代码。

<!DOCTYPE html> <body> <script type=”app/worker”>
addEventListener(‘message’, function () { postMessage(‘some message’);
}, false); </script> </body> </html>

上面是一段嵌入网页的本子,注意必须钦赐<script>标签的type质量是2个浏览器不认得的值,上例是app/worker

然后,读取那1段嵌入页面包车型大巴台本,用 Worker 来管理。

var blob = new
Blob([document.querySelector(‘#worker’).textContent]); var url =
window.URL.createObjectURL; var worker = new Worker; worker.onmessage
= function { // e.data === ‘some message’ };

地点代码中,先将放置网页的脚本代码,转成3个二进制对象,然后为这几个二进制对象生成
U奥迪Q3L,再让 Worker 加载那几个 U途观L。这样就马到成功了,主线程和 Worker
的代码都在同贰个网页上边。

有时,浏览器必要轮询服务器状态,以便第权且间得知意况改换。这些专业能够献身Worker 里面。

function createWorker { var blob = new Blob([f.toString; var url =
window.URL.createObjectURL; var worker = new Worker; return worker; }
var pollingWorker = createWorker(function { var cache; function
compare { … }; setInterval(function () {
fetch(‘/my-api-endpoint’).then(function { var data = res.json(); if
(!compare(data, cache)) { cache = data; self.postMessage; } }) },
1000) }); pollingWorker.onmessage = function () { // render data }
pollingWorker.postMessage;

地点代码中,Worker
每分钟轮询二遍数据,然后跟缓存做比较。倘使不均等,就表明服务端有了新的成形,由此将在布告主线程。

Worker 线程内部还是能再新建 Worker
线程。下边包车型地铁例证是将八个计量密集的任务,分配到十二个 Worker。

主线程代码如下。

var worker = new Worker(‘worker.js’); worker.onmessage = function {
document.getElementById.textContent = event.data; };

Worker 线程代码如下。

// worker.js // settings var num_workers = 10; var items_per_worker
= 1000000; // start the workers var result = 0; var pending_workers =
num_workers; for (var i = 0; i < num_workers; i += 1) { var
worker = new Worker(‘core.js’); worker.postMessage(i *
items_per_worker); worker.postMessage * items_per_worker);
worker.onmessage = storeResult; } // handle the results function
storeResult { result += event.data; pending_workers -= 1; if
(pending_workers <= 0) postMessage; // finished! }

上边代码中,Worker 线程内部新建了十个 Worker 线程,并且逐平素那11个Worker 发送音信,告知了总计的源点和终点。总括职责脚本的代码如下。

// core.js var start; onmessage = getStart; function getStart { start
= event.data; onmessage = getEnd; } var end; function getEnd { end =
event.data; onmessage = null; work(); } function work() { var result =
0; for (var i = start; i < end; i += 1) { // perform some complex
calculation here result += 1; } postMessage; close(); }

// Create a 32MB "file" and fill it.
var uInt8Array = new Uint8Array(1024*1024*32); // 32MB
for (var i = 0; i < uInt8Array .length; ++i) {
  uInt8Array[i] = i;
}
worker.postMessage(uInt8Array.buffer, [uInt8Array.buffer]);

7.1 主线程

浏览器原生提供Worker()构造函数,用来供主线程生成 Worker 线程。

var myWorker = new Worker(jsUrl, options);

Worker()构造函数,可以承受三个参数。第2个参数是本子的网站,该参数是必备的,且不得不加载
JS
脚本,不然会报错。第叁个参数是安排对象,该对象可选。它的三个效益便是内定Worker 的名目,用来分别多少个 Worker 线程。

// 主线程 var myWorker = new Worker(‘worker.js’, { name : ‘myWorker’
}); // Worker 线程 self.name // myWorker

Worker()构造函数重回2个 Worker 线程对象,用来供主线程操作
Worker。Worker 线程对象的习性和方法如下。

  • Worker.onerror:钦点 error 事件的监听函数。
  • Worker.onmessage:内定 message
    事件的监听函数,发送过来的多寡在Event.data属性中。
  • Worker.onmessageerror:内定 messageerror
    事件的监听函数。发送的数目无法类别化成字符串时,会接触这些事件。
  • Worker.postMessage():向 Worker 线程发送消息。
  • Worker.terminate():马上结束 Worker 线程。

5.API进阶

7.2 Worker 线程

Web Worker 有投机的全局对象,不是主线程的window,而是三个特别为 Worker
定制的大局对象。由此定义在window地方的对象和方法不是1切都能够应用。

Worker 线程有1对友好的大局属性和艺术。

  • self.name: Worker 的名字。该属性只读,由构造函数钦定。
  • self.onmessage:指定message事件的监听函数。
  • self.onmessageerror:内定 messageerror
    事件的监听函数。发送的数量不可能类别化成字符串时,会接触那一个事件。
  • self.close():关闭 Worker 线程。
  • self.postMessage():向爆发那些 Worker 线程发送消息。
  • self.importScripts():加载 JS 脚本。

此文已由作者授权腾讯云+社区发布

在worker线程中,能够获取下列对象

  1. navigator对象

  2. location对象,只读

  3. XMLHttpRequest对象

  4. setTimeout/setInterval方法

  5. Application Cache

  6. 由此importScripts()方法加载别的脚本

  7. 始建新的Web Worker

worker线程无法博得下列对象

  1. DOM对象

  2. window对象

  3. document对象

  4. parent对象

上述的正经,限制了在worker线程中获取主线程页面相关对象的力量,所以在worker线程中,不可能拓展dom成分的更新。

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website