天天看點

JavaScript多線程之HTML5 Web Worker

JavaScript多線程之HTML5 Web Worker

例如在JavaScript中嘗試計算像<code>fibonacci</code>這類計算密集型的操作,就會導緻整個頁面體驗被blocked。HTML5 Web Worker的出現讓我們在不阻塞目前JavaScript線程的情況下,在目前的JavaScript執行線程中可利用Worker這個類新開辟一個額外的線程來加載和運作特定的JavaScript檔案,這個新的線程和JavaScript的主線程之間并不會互相影響和阻塞執行的;并且在Web Worker中提供這個新線程和JavaScript主線程之間資料交換的接口:postMessage和onmessage事件。它和C# WinForm中的BackgroundWorker很類似。

fibonacci.js Worker JavaScript檔案:

在fibonacci.js中利用onmessage方法來監聽主線程發送的fibonacci計算請求,和利用postMessage傳回計算的結果到請求線程。

script.js 主線程JavaScript檔案:

在這個JavaScript檔案中,利用<code>new Worker('fibonacci.js')</code>方式來建立Web Worker對象,并利用Worker對象上的postMessage方法發送請求計算請求,以及利用Worker對象的onmessage的方法接受Worker線程的傳回結果,并顯示在UI界面上。同時我們也利用了console最新的time API來統計計算所花費的時間。

其顯示效果如下:

JavaScript多線程之HTML5 Web Worker

在console中列印的時間資訊為:

從這裡時間輸出可以看出,在計算n為40的<code>fibonacci</code> 開始時間開始急速的加長,在UI中傳回結果的時間也逐漸變長;但是在Web Worker背景計算的時候,它并不會阻塞我們的UI界面的其他互動。

Web Worker在這類耗時計算密集型操作中,顯得特别實用。在Web Worker中我們可以實作:

可以加載一個JS進行大量的複雜計算而不挂起主程序,并通過postMessage,onmessage進行通信;

可以在worker中通過importScripts(url)加載另外的腳本檔案;

可以使用 setTimeout(),clearTimeout(),setInterval(),clearInterval();

可以使用XMLHttpRequest來發送請求,以及通路navigator的部分屬性。

但是它也存在一些來自浏覽器<code>安全沙盒</code>的限制:

不能加載跨域的JavaScript檔案;

如檔案開始所說,考慮到JavaScript操作DOM的安全性問題,在Web Worker中不能通路界面中的DOM資訊,對于DOM的通路操作都必須委托給JavaScript主線程來操作;是以HTML5 Web Worker的出現的出現,并沒有改變JavaScript單線程執行的這個事實;

還有就是Web Worker的浏覽器相容性問題。它的浏覽器相容性圖如下:

JavaScript多線程之HTML5 Web Worker

本文轉自破狼部落格園部落格,原文連結:http://www.cnblogs.com/whitewolf/p/javascript-duo-xian-cheng-zhi-html5-web-worker.html,如需轉載請自行聯系原作者

繼續閱讀