成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

深入理解Web Workers

SolomonXie / 2086人閱讀

摘要:它們旨在除開(kāi)其他方面創(chuàng)建有效的離線體驗(yàn),攔截網(wǎng)絡(luò)請(qǐng)求,以及根據(jù)網(wǎng)絡(luò)是否可用采取合適的行動(dòng)并更新駐留在服務(wù)器上的資源。他們還將允許訪問(wèn)推送通知和后臺(tái)同步。是一種僅適用于的。音頻使得在上下文中直接完成腳本化音頻處理成為可能。

一.Web Workers是什么

Web Workers是JavaScript運(yùn)行在瀏覽器中的一種能力,它允許在主線程創(chuàng)建Worker線程,主線程執(zhí)行的同時(shí),Worker線程在后臺(tái)運(yùn)行,互不干擾,這并不是說(shuō)JavaScript本身具有多線程的能力,是js運(yùn)行在webkit瀏覽器中,瀏覽器為其啟動(dòng)了新的線程,從而實(shí)現(xiàn)多線程的功能.

二.Web Workers分類(lèi)

Web Workers中主要的兩種線程為專用線程Dedicated Worker和共享線程 Shared Worker,專用線程供單頁(yè)面使用,即專用線程不能被多個(gè)不同的頁(yè)面使用,共享線程能被多個(gè)不同的頁(yè)面使用.

2.1.專用線程(Dedicated Worker)

2.1.1專用線程實(shí)例

在輸入框輸入一個(gè)數(shù),計(jì)算出從1到該數(shù)字的和

(1).主線程代碼



  
    
    
  
  
    

(2).Worker線程代碼(Worker線程代碼寫(xiě)在worker.js中)

onmessage = function(event) {
  console.log("worker event data", event.data);
  var value = event.data;
  var sum = 0;
  for (var i = 1; i < value; i++) {
    sum += i;
  }
  postMessage(sum);
}

(3).執(zhí)行結(jié)果:

2.1.2線程執(zhí)行深度解析
根據(jù)以上述實(shí)例說(shuō)明
(1).首先調(diào)用Worker的構(gòu)造函數(shù)新建一個(gè)worker,指定一個(gè)腳本URI去執(zhí)行worker線程
(2).通過(guò)postMessage發(fā)送給worker線程
(3).在worker線程中用onmessage監(jiān)聽(tīng)消息數(shù)據(jù),并接收封裝在event參數(shù)data屬性中的數(shù)據(jù)
(4).worker將處理過(guò)的數(shù)據(jù)再通過(guò)postMessage發(fā)送給主線程
(5).worker線程返回?cái)?shù)據(jù)后,執(zhí)行主線程的onmessage回調(diào)函數(shù),調(diào)用worker.terminate()終止線程執(zhí)行,當(dāng)worker線程執(zhí)行出錯(cuò)時(shí)會(huì)調(diào)用onerror回調(diào)函數(shù).

詳解:
代碼執(zhí)行到 var worker = new Worker("worker.js"),會(huì)在webkit內(nèi)核中構(gòu)造一個(gè)webCore::jsWorker對(duì)象,并根據(jù)腳本地址發(fā)起異步加載流程,此時(shí)主線程并不會(huì)阻塞,等待worker線程的執(zhí)行結(jié)果,而是會(huì)接著往下執(zhí)行.接著主線程執(zhí)行postMessage,這時(shí)worker線程還么有創(chuàng)建完成,通過(guò)input輸入框輸入的數(shù)據(jù)將放在消息隊(duì)列中等待,直到worker線程創(chuàng)建完畢;worker線程復(fù)制消息數(shù)據(jù)到workerRunLoop消息隊(duì)列中,woker線程處理消息數(shù)據(jù)后將數(shù)據(jù)通過(guò)自身的postMessage發(fā)送,主線程執(zhí)行worker.onmessage回調(diào)函數(shù),執(zhí)行完畢后關(guān)閉線程.如果主線程接著給worker線程發(fā)送數(shù)據(jù)消息,worker線程會(huì)直接將復(fù)制消息數(shù)據(jù)到WorkerRunLoop.如圖所示

2.1.3Transferrable objects可轉(zhuǎn)讓對(duì)象
主線程和子線程之間可以通過(guò)結(jié)構(gòu)化克隆算法(復(fù)制副本)的方式傳入傳出不同類(lèi)型數(shù)據(jù),比如File,Blob,ArrayBuffer和json對(duì)象,如果用postMessag傳出一個(gè)50MB的文件將會(huì)非常消耗性能,為了解決這個(gè)問(wèn)題,可以將主線程中的數(shù)據(jù)直接傳遞給worker線程這就是Transferrable objects.

// Transferable Objects 格式
worker.postMessage(arrayBuffer, [arrayBuffer]);

// 例子1
var ab = new ArrayBuffer(1);
worker.postMessage(ab, [ab]);
//例子2
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]);

2.1.4應(yīng)用場(chǎng)景

(1).預(yù)先緩存并抓取數(shù)據(jù)供后期使用
(2).分析音視頻數(shù)據(jù),canvas繪圖數(shù)據(jù)的運(yùn)算和圖形生成處理
(3).大量數(shù)據(jù)分析和計(jì)算處理
(4).拼寫(xiě)檢查
(5).代碼高亮處理或者其他一些頁(yè)面文字格式化處理

2.1.5總結(jié)
學(xué)習(xí)專用線程,其實(shí)它可以和生活中的例子相結(jié)合起來(lái),比如領(lǐng)導(dǎo)給員工分配任務(wù),讓A員工把產(chǎn)品的原型畫(huà)出來(lái)后交給B員工去實(shí)現(xiàn)(領(lǐng)導(dǎo)作為主線程),A員工在接收到任務(wù)message后開(kāi)始工作,工作的產(chǎn)出的原型就是postMessage要返回的數(shù)據(jù),B員工在沒(méi)拿到原型時(shí)還做的他之前的工作,收到A員工給的原型開(kāi)始實(shí)現(xiàn)原型,實(shí)現(xiàn)完成后將產(chǎn)出結(jié)果給領(lǐng)導(dǎo)演示.結(jié)合這個(gè)例子可以理解專用線程的大致流程.

2.1.6兼容性

2.2共享線程(Shared Worker)

2.2.1共享線程實(shí)例

兩個(gè)頁(yè)面分別給一個(gè)SharedWorker發(fā)送數(shù)據(jù)并接收同一個(gè)共享線程發(fā)送的數(shù)據(jù)
//A頁(yè)面js代碼
  var worker = new SharedWorker("./worker.js");
  var port = worker.port;
  console.log("test port", port);
  port.postMessage("test000");
  port.onmessage = function(event) {
    console.log("test receive data", event.data);
  }
//B頁(yè)面js代碼
  var worker = new SharedWorker("worker.js");
  var port = worker.port;
  console.log("worker1 port", port);
  port.postMessage("test111");
  port.onmessage = function(event) {
    console.log("test1 receive data", event.data);
  };
//worker.js(即SharedWorker)代碼
onconnect = function(event) {
  var port = event.ports[0];
  port.onmessage = function(e) {
    port.postMessage(e.data);
  }
}

執(zhí)行結(jié)果:

2.2.2應(yīng)用場(chǎng)景
共享線程主要用在同一個(gè)線程被多個(gè)頁(yè)面或線程使用,比如,抓取緩存數(shù)據(jù)多個(gè)頁(yè)面需要使用,在瀏覽器兼容的情況下可以使用ShareWorker.

2.2.3總結(jié)
在測(cè)試上述例子時(shí),用google瀏覽器測(cè)試,共享線程中的例子不執(zhí)行,希望能得到解答和幫助

2.2.4兼容性

三.專用線程和共享線程的區(qū)別和注意事項(xiàng)

3.1區(qū)別
(1)共享worker通信必須通過(guò)端口對(duì)象(一個(gè)確切的打開(kāi)的端口)供腳本與worker通信,而專用線程在設(shè)置onmessage消息處理函數(shù)時(shí)會(huì)隱式的打開(kāi)與主線程的端口連接.
3.2注意事項(xiàng)

(1).在寫(xiě)demo測(cè)試時(shí),Google瀏覽器直接打開(kāi)文件,會(huì)當(dāng)成是跨域問(wèn)題,報(bào)類(lèi)似如下錯(cuò)誤,啟用本地服務(wù)器測(cè)試就可以了,用Node啟用本地服務(wù)器,可以看我的另一個(gè)文章 https://segmentfault.com/a/11...

(2)分配給 Worker 線程運(yùn)行的腳本文件,必須與主線程的腳本文件同源。

(3)worker線程不能獲取DOM,window,document,parent對(duì)象,可以獲取navigator,Location,XMLHttpRequest對(duì)象,setInterval/setTimeout方法, Application Cache,可以通過(guò)importScripts()方法加載其他腳本,可以創(chuàng)建新的Web Worker。

四.其他類(lèi)型Worker

4.1 ServiceWorkers (服務(wù)worker)

一般作為web應(yīng)用程序、瀏覽器和網(wǎng)絡(luò)(如果可用)之前的代理服務(wù)器。它們旨在(除開(kāi)其他方面)創(chuàng)建有效的離線體驗(yàn),攔截網(wǎng)絡(luò)請(qǐng)求,以及根據(jù)網(wǎng)絡(luò)是否可用采取合適的行動(dòng)并更新駐留在服務(wù)器上的資源。他們還將允許訪問(wèn)推送通知和后臺(tái)同步API。

4.2 Chrome Workers

是一種僅適用于firefox的worker。如果您正在開(kāi)發(fā)附加組件,希望在擴(kuò)展程序中使用worker且有在你的worker中訪問(wèn) js-ctypes 的權(quán)限,你可以使用Chrome Workers。詳情請(qǐng)參閱ChromeWorker。

4.3 Audio Workers (音頻worker)

使得在web worker上下文中直接完成腳本化音頻處理成為可能。

望不對(duì)之處請(qǐng)指正!

主要參考文章:

1.http://www.alloyteam.com/2015...
2.https://developer.mozilla.org...
3.http://www.ruanyifeng.com/blo...

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/100154.html

相關(guān)文章

  • 深入理解 Event Loop

    摘要:即使現(xiàn)在支持,由于沒(méi)有多線程的機(jī)制,和執(zhí)行線程只能通過(guò)來(lái)通信,而且由于沒(méi)有鎖,無(wú)法訪問(wèn)和對(duì)象。的單線程是指一個(gè)瀏覽器進(jìn)程中只有一個(gè)的執(zhí)行線程,即同一時(shí)刻內(nèi)只會(huì)有一段代碼在執(zhí)行。與單線程如何實(shí)現(xiàn)異步設(shè)計(jì)了一個(gè)事件循環(huán)的方式。眾所周知,JavaScript(以下簡(jiǎn)稱 JS) 是單線程語(yǔ)言,在 html5 中增加了 web workers,web workers 是新開(kāi)了線程執(zhí)行的,那么 JS 還...

    Carbs 評(píng)論0 收藏0
  • JavaScript是如何工作的:Web Workers的構(gòu)建塊+ 5個(gè)使用他們的場(chǎng)景

    摘要:最后,提供個(gè)正確使用的場(chǎng)景。異步編程的一個(gè)很好的用例就請(qǐng)求。這意味著異步函數(shù)只能解決一小部分語(yǔ)言單線程中的局限性問(wèn)題。中有類(lèi)似的集群子進(jìn)程概念,他們也是多線程但是和還是有區(qū)別。可用的特性由于的多線程特性,工作者只能訪問(wèn)特性的一個(gè)子集。 showImg(https://segmentfault.com/img/bVblS8J?w=400&h=298); 這是專門(mén)探索 JavaScript...

    ningwang 評(píng)論0 收藏0
  • JavaScript 是如何工作的:Service Worker 的生命周期及使用場(chǎng)景

    摘要:的生命周期的生命周期與頁(yè)面完全分離。換句話說(shuō),這個(gè)將為這個(gè)域中的所有內(nèi)容接收事件。這不是必要的,但絕對(duì)是推薦的。新的將啟動(dòng)并且安裝事件將被移除。使用,可以很容易被劫持連接并偽造響應(yīng)。后臺(tái)同步允許延遲操作,直到用戶具有穩(wěn)定的連接。 這是專門(mén)探索 JavaScript 及其所構(gòu)建的組件的系列文章的第8篇。 想閱讀更多優(yōu)質(zhì)文章請(qǐng)猛戳GitHub博客,一年百來(lái)篇優(yōu)質(zhì)文章等著你! 如果你錯(cuò)過(guò)了前...

    zzzmh 評(píng)論0 收藏0
  • JavaScript 工作原理之八-Service Workers,生命周期及其使用場(chǎng)景

    摘要:生命周期的生命周期和網(wǎng)頁(yè)完全不相關(guān)。意即會(huì)作用于整個(gè)源地址上。激活安裝完之后下一步即激活。同時(shí)檢查響應(yīng)類(lèi)型是否為,即檢查請(qǐng)求是否同域。創(chuàng)建新的的過(guò)程將會(huì)啟動(dòng),然后觸發(fā)事件??梢岳媒俪志W(wǎng)絡(luò)連接和偽造響應(yīng)數(shù)據(jù)。 原文請(qǐng)查閱這里,略有刪減,本文采用知識(shí)共享署名 4.0 國(guó)際許可協(xié)議共享,BY Troland。 本系列持續(xù)更新中,Github 地址請(qǐng)查閱這里。 這是 JavaScript 工...

    oysun 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<