Web workers 是什麼javascript
Web workers 是HTML5標準的一部分, 這一規範定義了一套API,它容許一段JavaScript程序運行在主線程之外的另一個線程中。Web Workers 規範中定義了兩類工做線程,分別是專用線程Dediacted worker 和共享線程 Shared Worker, 其中, Dedicated Woker 只能爲一個頁面所使用,而Shared Worker 則能夠被多個頁面所共享,本文示例爲專用線程Dedicated Worker.css
一個小例子html
下載地址:https://github.com/mdn/simple-web-workerhtml5
index.html
java
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <meta name="viewport" content="width=device-width"> <title>Web Workers basic example</title> <link rel="stylesheet" href="style.css"> <!--[if lt IE 9]> <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script> <![endif]--> </head> <body> <h1>Web<br>Workers<br>basic<br>example</h1> <div class="controls" tabindex="0"> <form> <div> <label for="number1">Multiply number 1: </label> <input type="text" id="number1" value="0"> </div> <div> <label for="number2">Multiply number 2: </label> <input type="text" id="number2" value="0"> </div> </form> <p class="result">Result: 0</p> </div> </body> <script src="main.js"></script> </html>
main.jsgit
var first = document.querySelector('#number1'); var second = document.querySelector('#number2'); var result = document.querySelector('.result'); if (window.Worker) { // Check if Browser supports the Worker api. // Requries script name as input var myWorker = new Worker("worker.js"); // onkeyup could be used instead of onchange if you wanted to update the answer every time // an entered value is changed, and you don't want to have to unfocus the field to update its .value first.onchange = function() { myWorker.postMessage([first.value,second.value]); // Sending message as an array to the worker console.log('Message posted to worker'); }; second.onchange = function() { myWorker.postMessage([first.value,second.value]); console.log('Message posted to worker'); }; myWorker.onmessage = function(e) { result.textContent = e.data; console.log('Message received from worker'); }; }
worker.jsgithub
onmessage = function(e) { console.log('Message received from main script'); var workerResult = 'Result: ' + (e.data[0] * e.data[1]); console.log('Posting message back to main script'); postMessage(workerResult); }
簡單小結:web
Web主線程:ajax
1.經過 var worker = new worker(url)加載一個js文件來建立一個worker, 同時返回一個worker實例。chrome
2. 經過 worker.postMessage(data) 方法來向worker發送數據。
3. 綁定 worker.onmessage方法來接收worker發送過來的數據。
4. 能夠使用 worker.terminate()來終止一個worker的執行。
worker新線程:
1. 綁定onmessage方法來接收主線程發送過來的數據。
2.經過postMessage(data)方法來向主線程發送數據。
3.能夠使用self.close()來終止一個worker的執行。
API 進階
關於 web workers, 最重要的是要知道它執行的javascript代碼徹底在另外一個做用域中,與當前網頁中的代碼不共享做用域。在web workers中,一樣有一個全局對象(woker對象自己,this和self 引用的都是worker對象自己)和其餘對象以及方法。
Web worker中的代碼不能訪問Dom.
在worker線程中,能夠得到下列對象
1 .navigator對象
2. location對象,只讀
3. XMLhtttpRequest獨享
4. setTimeout/setInterval方法
5. Application Cache
6. 經過importScripts()方法加載其餘腳本
7. 建立新的Web Worker
worker線程不能得到下列對象:
1. DOM對象
2. window對象
3. document對象
4. parent對象
上述的規範,限制了在worker線程中得到主線程頁面相關對象的能力,因此在worker線程中,不能進行dom元素的更新。
Web workers帶來了什麼
1. Web workers 帶來後臺計算能力
Web workers 自身是由webkit多線程實現,但他並無爲javascript語言帶來多線程編程特性,咱們如今仍然不能在javascript代碼中建立並管理一個線程,或者主動控制線程間的同步與鎖等特性。
Web workers典型應用場景
既然Web workers 爲瀏覽器端javascript帶來了後臺計算能力,咱們能夠利用這一能力,將更新數據和對象狀態的耗時部分交由Web workers執行,提高頁面性能。
部分典型的應用場景以下:
1. 使用專用線程進行數學運算
Web workers 最簡單的應用就是用來作後臺計算,而這種計算並不會中斷前臺用戶的操做。
2. 圖像處理
經過使用<canvas>或者<video>元素中獲取的數據,能夠把圖像分割成幾個不一樣的區域而且把它們推送給並行的不一樣workers來作計算。
3. 大量數據的檢索
但須要在調用ajax後處理大量的數據,若是處理這些數據所需的時間長短很是重要,能夠在Web workers中來作這些,避免凍結UI線程。
4. 背景數據分析
因爲在使用 Web Workers的時候,咱們有更多潛在的CPU可用時間,咱們如今能夠考慮一下javascript中的新應用場景。
例如, 咱們能夠想象在不影響UI體驗的狀況下實時處理用戶輸入。利用這樣一種可能,咱們能夠想象一個像word同樣的應用:當用戶打字時,後臺在詞典中進行查找,幫助用戶自動糾錯等等。
參考文章:
https://developer.mozilla.org/en-US/docs/Web/API/Worker
http://www.ibm.com/developerworks/cn/web/1112_sunch_webworker/index.html
http://www.tools138.com/create/article/20151111/020119942.html