Web Worker
是HTML5
提出的新標准,為 JavaScript 創造多線程環境,允許主線程創建 Worker 線程,將一些任務分配給后者運行。在主線程運行的同時,Worker 線程在后台運行,兩者互不干擾。等到 Worker 線程完成計算任務,再把結果返回給主線程。這樣的好處是,一些計算密集型或高延遲的任務,被 Worker 線程負擔了,主線程(通常負責 UI 交互)就會很流暢,不會被阻塞或拖慢。
注意
1.性能上要注意
Worker 線程一旦新建成功,就會始終運行,不會被主線程上的活動(比如用戶點擊按鈕、提交表單)打斷。這樣有利於隨時響應主線程的通信。但是,這也造成了 Worker 比較耗費資源,不應該過度使用,而且一旦使用完畢,就應該關閉。
2.同源限制
分配給 Worker 線程運行的腳本文件,必須與主線程的腳本文件同源。
3.DOM限制
Worker 線程所在的全局對象,與主線程不一樣,無法讀取主線程所在網頁的 DOM 對象,也無法使用document
、window
、parent
這些對象。但是,Worker 線程可以navigator
對象和location
對象。
4.通信聯系
Worker 線程和主線程不在同一個上下文環境,它們不能直接通信,必須通過消息完成。
5.腳本限制
Worker 線程不能執行alert()
方法和confirm()
方法,但可以使用 XMLHttpRequest 對象發出 AJAX 請求。
6.文件限制
Worker 線程無法讀取本地文件,即不能打開本機的文件系統(file://
),它所加載的腳本,必須來自網絡。
Demo
關於這個demo又幾點需要注意的地方。
-
因
Web Worker
是HTML5的新標准所以ECMAScript的標准語法中並不支持,這個demo實在瀏覽器上進行測試,支持HTML的瀏覽器除IE外都能很好的兼容Web Worker
,IE10部分兼容。我這里選擇的chrome進行測試。 -
由於Worker構造函數 不能讀取本地文件,關於worker線程的腳本文件需要通過網絡下載,否則會報404(這點需要特別注意下)
為了順利測試解決worker線程的腳本需要通過網絡下載的問題這里我將WebWorkerDemo部署到本機的nginx上面使用chrom進行訪問
index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <button id="btn1">start worker!</button> <button id="btn2">postMessage Main====>worker</button> <button id="btn3">stop worker!</button> <script src="main.js"></script> </body> </html>
main.js
(function() { let startWorker = document.querySelector('#btn1'); let postMessage = document.querySelector('#btn2'); let stopWorker = document.querySelector('#btn3'); let worker; let data = 10; startWorker.addEventListener('click', () => { worker = new Worker('worker1.js'); worker.addEventListener('message', (event) => { console.log(event.data); if (!event.data) { console.log('closes worker thread'); worker.terminate(); } }, false); }); postMessage.addEventListener('click', () => { worker.postMessage(data); }); stopWorker.addEventListener('click', () => { worker.terminate(); }); }());
worker1.js
(function () { console.log('start worker'); this.addEventListener('message', (event) => { let count = event.data; setInterval(() => { postMessage(count--); }, 1000); }, false); }());
運行結果
Node.js的線程和進程
了解一下
參考