worker和sharedworker


1、介紹

 h5的新功能,主要作用,開辟新線程,充分利用計算機算力,防止“假死”(單線程,js引擎和UI線程互斥)

worker:專屬線程,只針對當前運行環境

sharedWorker:共享線程,同源策略下,多個運行環境共用同一個線程,包括數據。

 

2、worker使用

 

1、查看文檔

阮一峰worker網絡日子

 

2、線程js文件

self.addEventListener('message', function (event) {
    setTimeout(() => {
        self.postMessage("1111-------1111")
    }, 2000);
});
 

 

3、html文件

<!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>Shared Workers basic example</title>
  </head>
  <body>
    <div class="controls" tabindex="0">
    <button onclick="aa()">按鈕</button>
    </div>
    <script>
        function aa(){
            var worker = new Worker('work.js', { name : 'myWorker' })
            worker.postMessage({name:'12321'})
            worker.addEventListener('message', function (event) {
                console.log(event.data,event);
            });
        }
    </script>
  </body>
</html>

 

4、注意事項

本地開發有同源策略問題,谷歌瀏覽器可以通過:chrome://inspect/#workers查看相關信息

 

3、sharedWorker

 

1、前言

sharedworker使用和worker差別不大,sharedworker是共享線程,那么,如何實現共享呢?

 

是根據實例化時候,傳入參數,第一個參數:url;第二個參數:sharedworker相關的配置。

第一個參數和第二個參數的name一致(name可能有調整),則調用同一個線程,里面暫存的數據也能實現共享

 

 

sharedworker嚴格遵循同源策略,即代碼需要在同域,如果不同域(本地開發),則實現效果和worker無差別,如何實現本地調試?

 

前端服務即可:安裝http-server,對應的文件夾下面跑起來,直接調用,關閉/開啟前端服務chrome://inspect/#workers 即可看到分別開啟了兩個線程、一個線程

 

2、線程js文件

var a = 1;
onconnect = function (e) {
    var port = e.ports[0];
    port.onmessage = function () {
        port.postMessage(a++)
    }
}

 

3、html文件(index.html)

 

<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><title>worker demo</title></head>
<body>
    <div> <h1>使用shared worker:</h1> </div>
    <button style="padding: 10px; margin: 10px 0;">點擊一下</button>
    <div><span>點了 <span class="time">-</span> 下</span></div>
    <iframe src="index2.html" width='500px' height="400px"></iframe>
    <script>
        let button = document.querySelector('button');
        let worker = new SharedWorker('worker.js');
        worker.port.start();
        let time;
        button.addEventListener('click', function () {
            worker.port.postMessage('start');
        });
        let timeDom = document.querySelector('.time');
        worker.port.onmessage = function (val) {
            timeDom.innerHTML = val.data
        }
    </script>
</body>
</html>

 

4、html文件(index2.html)

<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><title>worker demo</title></head>
<body>
    <div><h1>使用shared  worker:</h1></div>
    <button style="padding: 10px; margin: 10px 0;">點擊一下</button>
    <div><span>點了 <span class="time">-</span> 下</span></div>
    <script>
        let button = document.querySelector('button');
        let worker = new SharedWorker('worker.js');
        worker.port.start();
        let time;
        button.addEventListener('click', function () {
            worker.port.postMessage('start');
        });
        let timeDom = document.querySelector('.time');
        worker.port.onmessage = function (val) {
            timeDom.innerHTML = val.data
        }
    </script>
</body>
</html>

 

5、參考鏈接:很多很多(諸位原作者抱歉)。。。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM