Web Workers

1.JS單線程

說起Web Workers袖瞻,首先必須了解因為JS運行在瀏覽器中辙诞,是單線程的,每個window一個JS線程,既然是單線程的骗村,在某個特定的時刻只有特定的代碼能夠被執(zhí)行嫌褪,并阻塞其它的代碼。而瀏覽器是事件驅動的(Event driven)胚股,瀏覽器中很多行為是異步(Asynchronized)的渔扎,會創(chuàng)建事件并放入執(zhí)行隊列中。javascript引擎是單線程處理它的任務隊列信轿,你可以理解成就是普通函數(shù)和回調(diào)函數(shù)構成的隊列。當異步事件發(fā)生時残吩,如mouse click, a timer firing, or an XMLHttpRequest completing(鼠標點擊事件發(fā)生财忽、定時器觸發(fā)事件發(fā)生、XMLHttpRequest完成回調(diào)觸發(fā)等)泣侮,將他們放入執(zhí)行隊列即彪,等待當前代碼執(zhí)行完成。

2.Web Workers(多線程)

什么是Web Worker活尊?

web worker 是運行在后臺的 JavaScript隶校,獨立于其他腳本,不會影響頁面的性能蛹锰。您可以繼續(xù)做任何愿意做的事情:點擊深胳、選取內(nèi)容等等,而此時 web worker 在后臺運行铜犬。

有什么好處舞终?

1:子線程計算不會阻塞主線程

2:充分利用CPU!

OK癣猾,現(xiàn)在來具體實現(xiàn)多線程敛劝!

var oW = new Worker('a.js');
//a.js是子線程js文件纷宇,代表的是后臺需要處理的地址
oW.postMessage(12);
//在多線程里夸盟,利用postMessage來傳輸數(shù)據(jù)

下面來寫a.js文件。

//用onmessage事件來接收數(shù)據(jù)像捶,ev.data代表的是接收過來的數(shù)據(jù)上陕,這里指主線程發(fā)過來的12
self.onmessage=function(ev){
//self指全局worker對象(用this也行)
  alert(ev.data)
}

這里需要注意的是上面在子線程里用alert是錯誤的。

安全與限制

在worker的代碼中作岖,不要訪問一些重要的JavaScript對象唆垃,如document、window痘儡、console辕万、parent,更重要的是不要訪問DOM對象。也許不用DOM元素以至不能更新頁面元素聽上去有點嚴格渐尿,但是這是一個重要的安全設計決定醉途。

想象一下,如果眾多線程都試著去更新同一個元素那就是個災難砖茸。所以隘擎,web worker需要處在一個嚴格的并線程安全的環(huán)境中。

正如之前所說凉夯,你可以通過worker處理數(shù)據(jù)盛龄,并將結果返回主線程圣拄,進而更新DOM元素。盡管它們不能訪問一些重要的JavaScript對象,但是它們可以調(diào)用一些函數(shù)钟些,如setTimeout()/clearTimeout()克婶、setInterval()/clearInterval()穷当、navigator等等昔善,也可以訪問XMLHttpRequest和localStorge對象。

為了能和服務器交互人柿,worker必須遵守同源策略(same-origin policy)(譯注:可參考國人文章同源策略)柴墩。比如,位于http://www.example.com/ 內(nèi)的腳本文件不能訪問https://www.example.com 的腳本凫岖。盡管域名相同江咳,但同源策略要求端口也必須一致。通常哥放,這不會成為一個很大的問題扎阶。但是你很有可能會同一個域名編寫worker和client,所以知道這點對你總是有所幫助婶芭。

整體Worker具體步驟就是這樣的 东臀,下面完整寫一個主線程發(fā)給子線程一個數(shù)組數(shù)據(jù),然后子線程處理數(shù)據(jù)數(shù)據(jù)并發(fā)回主線程的代碼犀农。

//開啟了子線程
var arr = [12,5,8];
var oW = new Worker('d.js');
//發(fā)送
oW.postMessage(arr)
oW.onmessage = function (ev) {
   alert(ev.data);//666,5,8
};
console.log(arr);//12,5,8
//主線程和子線程有它們各自的獨立空間惰赋,信息主要是來回交換而不是共享。

d.js文件

self.onmessage = function(ev){
      ev.data[0] = 666;
      this.postMessage(ev.data);
};

當然呵哨,Workers不是簡簡單單修改一個數(shù)組這么簡單了赁濒,那么什么時候可以用到多線程呢?

worker的實際發(fā)生場景可能是孟害,你需要處理一個同步的第三方接口拒炎,于是主線程需要等待結果再進行下一步操作。這種情況下挨务,你可以生成一個worker击你,由它代理玉组,異步完成此任務。

Web worker在輪詢情況下也非常適用丁侄,你可以在后臺不斷查詢目標惯雳,并在有新數(shù)據(jù)時向主線程發(fā)送消息。

你也許遇到需要向服務端返回大量的數(shù)據(jù)的情況鸿摇。通常石景,處理大量數(shù)據(jù)會消極影響程序的響應能力,然后導致不良用戶體驗拙吉。更優(yōu)雅的辦法是將處理工作分配給若干worker潮孽,由它們處理不重疊的數(shù)據(jù)。

還有應用場景會出現(xiàn)在通過多個web worker分析音頻或視頻的來源筷黔,每個worker針對專項問題恩商。

譯注:本人不是什么大牛,只是一個一直在學習的小程序員必逆,如果文章內(nèi)容當中有什么不對的地方請與我討論,共同進步揽乱!

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末名眉,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子凰棉,更是在濱河造成了極大的恐慌损拢,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,013評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件撒犀,死亡現(xiàn)場離奇詭異福压,居然都是意外死亡,警方通過查閱死者的電腦和手機或舞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評論 2 382
  • 文/潘曉璐 我一進店門荆姆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人映凳,你說我怎么就攤上這事胆筒。” “怎么了诈豌?”我有些...
    開封第一講書人閱讀 152,370評論 0 342
  • 文/不壞的土叔 我叫張陵仆救,是天一觀的道長。 經(jīng)常有香客問我矫渔,道長彤蔽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,168評論 1 278
  • 正文 為了忘掉前任庙洼,我火速辦了婚禮顿痪,結果婚禮上镊辕,老公的妹妹穿的比我還像新娘。我一直安慰自己员魏,他們只是感情好丑蛤,可當我...
    茶點故事閱讀 64,153評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著撕阎,像睡著了一般受裹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上虏束,一...
    開封第一講書人閱讀 48,954評論 1 283
  • 那天棉饶,我揣著相機與錄音,去河邊找鬼镇匀。 笑死照藻,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的汗侵。 我是一名探鬼主播幸缕,決...
    沈念sama閱讀 38,271評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼晰韵!你這毒婦竟也來了发乔?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 36,916評論 0 259
  • 序言:老撾萬榮一對情侶失蹤雪猪,失蹤者是張志新(化名)和其女友劉穎栏尚,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體只恨,經(jīng)...
    沈念sama閱讀 43,382評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡译仗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,877評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了官觅。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片纵菌。...
    茶點故事閱讀 37,989評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖休涤,靈堂內(nèi)的尸體忽然破棺而出产艾,到底是詐尸還是另有隱情,我是刑警寧澤滑绒,帶...
    沈念sama閱讀 33,624評論 4 322
  • 正文 年R本政府宣布闷堡,位于F島的核電站,受9級特大地震影響疑故,放射性物質發(fā)生泄漏杠览。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,209評論 3 307
  • 文/蒙蒙 一纵势、第九天 我趴在偏房一處隱蔽的房頂上張望踱阿。 院中可真熱鬧管钳,春花似錦、人聲如沸软舌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽佛点。三九已至醇滥,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間超营,已是汗流浹背鸳玩。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留演闭,地道東北人不跟。 一個月前我還...
    沈念sama閱讀 45,401評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像米碰,于是被迫代替她去往敵國和親窝革。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,700評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 當瀏覽器切換到后臺運行,操作系統(tǒng)會把瀏覽器掛起,掛起之后,比如定時器,在回到原來頁面的時候,會出現(xiàn)獲取秒有重復的問...
    殷灬商閱讀 522評論 1 3
  • Web Workers可以讓web應用程序具備后臺處理能力吕座,使用Worker類加載一個javascript文件來開...
    幸福鐮刀閱讀 713評論 1 0
  • “Web Workers”在WHATWG里已經(jīng)是LS虐译,被大多數(shù)瀏覽器支持,詳細可看caniuse米诉。 在講述Web ...
    butterandfly閱讀 520評論 0 1
  • 小城市真的安靜的特別早。 晚上一個人騎自行車總是習慣音量開到很大篷帅,大到根本聽不到外界的聲音史侣。就這樣一直騎著騎著。 ...
    城市花大姐閱讀 571評論 0 49
  • 最近幾天經(jīng)常做關于一個朋友的夢魏身。 簡稱她為xd惊橱,我們是高中同學,高一結束時我們分到了一個班里箭昵,神奇的是我們高二升...
    想不出昵稱的狗閱讀 145評論 0 1