本篇文章給大家帶來的內容是關於HTML5 Web Worker的介紹(附示例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。
瀏覽器中的Web Worker
背景介紹
我們都知道JavaScript這個語言在執行的時候是採用單線程進行執行的,也就是說在同一時間只能做一件事,這也和這門語言有很大的關係,採用同步執行的方式進行運行,如果出現阻塞,那麼後面的代碼將不會執行,HTML5則提出了web Worker標準,表示JavaScript允許有多個線程,但是子線程完全受主線程的控制,子線程不能操作DOM,只有主線程可以操作DOM,所以以主線程為主的單線程執行原理成了JavaScript這門語言的核心。
進程與線程的區別
根本區別:進程是操作系統資源分配的基本單位,而線程是任務調度和執行的基本單位。
在操作系統中能同時運行多個進程(程序);而在同一個進程(程序)中有多個線程同時執行。
兼容性
web worker是什麼?
簡單來說,其實就是在Javascript單線程執行的基礎上,開啟一個子線程,進行程序處理,而不影響主線程的執行,當子線程執行完畢之後再回到主線程上,在這個過程中並不影響主線程的執行過程。
舉個栗子
傳統情況下,執行下面的代碼後,整個頁面都會被凍結,由於javascript是單線程處理,如下代碼已經完全組塞了後續的執行
while(1){}
如果換一種方式,我們通過開啟一個新的線程來執行這段代碼,將他放在一個單獨的worker.js文件中,在主線程執行以下代碼,則可以避免這種情況。
var worker = new Worker("worker.js")
Web Worker的用法
判斷當前瀏覽器是否支持web worker
if (typeof (Worker) != "undefined") { //瀏覽器支持web worker
if (typeof (w) == "undefined") { //w是未定義的,還沒有開始計數
w = new Worker("webworker.js"); //創建一個Worker對象,利用Worker的構造函數
}
//onmessage是Worker對象的properties
w.onmessage = function (event) { //事件處理函數,用來處理後端的web worker傳遞過來的消息
// do something
};
}
else { // 瀏覽器不支持web worker
// do something
}
API
①創建新的Worker
var worker = new Worker("worker.js")
②傳遞參數
worker.postMessage()
③接收消息
worker.onMessage = function(msg){}
④異常處理
worker.onerror = function(err){}
⑤結束worker
worker.terminate()
⑥載入工具類函數
importScripts()
Worker作用域
當我們創建一個新的worker時,該代碼會運行在一個全新的javascript的環境中(WorkerGlobalScope)運行,是完全和創建worker的腳本隔離,這時我們可以吧創建新worker的腳本叫做主線程,而被創建的新的worker叫做子線程。
WorkerGlobalScope是worker的全局對象,所以它包含所有核心javascript全局對象擁有的屬性如JSON等,window的一些屬性,也擁有類似於XMLHttpRequest()等。
但是我們所開啟的新的worker也就是子線程,並不支持操作頁面的DOM。
線程間的通訊是傳值而不是傳地址
主線程與子線程數據通信方式有多種,通信內容,可以是文本,也可以是對象。需要注意的是,這種通信是拷貝關係,即是傳值而不是地址,子線程對通信內容的修改,不會影響到主線程。事實上,瀏覽器內部的運行機制是,先將通信內容串行化,然後把串行化後的字符串發給子線程,後者再將它還原。
JavaScript中的數據類型存放原理以及傳遞規則
共享線程(SharedWorker)
共享線程是為了避免線程的重複創建和銷燬過程,降低了系統性能的消耗,
共享線程SharedWorker可以同時有多個頁面的線程鏈接。
使用SharedWorker創建共享線程,也需要提供一個javascript腳本文件的URL地址或Blob,該腳本文件中包含了我們在線程中需要執行的代碼,如下:
var worker = new SharedWorker("sharedworker.js");
共享線程也使用了message事件監聽線程消息,但使用SharedWorker對象的port屬性與線程通信如下:
worker.port.onmessage = function(msg){};
同時我們也可以使用SharedWorker對象的port屬性向共享線程發送消息如下:
worker.port.postMessage(msg);
運行原理
生命週期
①當一個web worker的文檔列表不為空的時候,這個web worker會被稱之為許可線程。
②當一個web worker的文檔列表中的任何一個對象都是處於完全活動狀態的時候,這個web worker會被稱之為需要激活線程。
③當一個web worker是許可線程並且擁有計數器或者擁有數據庫事務或者擁有網絡連接或者它的web worker列表不為空的時候,這個web worker會被稱之為受保護的線程。
④當一個web worker是一個非需要激活線程同時又是一個許可線程的時候,這個web worker會被稱之為可掛起線程。
以webKit為例加載並執行worker的過程
應用
可以做什麼:
1.可以加載一個JS進行大量的複雜計算而不掛起主進程,並通過postMessage,onmessage進行通信
2.可以在worker中通過importScripts(url)加載另外的腳本文件
3.可以使用 setTimeout(), clearTimeout(), setInterval(), and clearInterval()
4.可以使用XMLHttpRequest來發送請求
5.可以訪問navigator的部分屬性
不可以做什麼:
1.不能跨域加載JS
2.worker內代碼不能訪問DOM
3.各個瀏覽器對Worker的實現不大一致,例如FF裡允許worker中創建新的worker,而Chrome中就不行
4.不是每個瀏覽器都支持這個新特性
以上就是HTML5 Web Worker的介紹(附示例)的詳細內容,更多請關注其它相關文章!
更多技巧請《轉發 + 關注》哦!
閱讀更多 科技i關注 的文章