亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > HTML5 > 正文

淺談HTML5 Web Worker的使用

2024-09-05 07:22:17
字體:
來源:轉載
供稿:網友

Web Worker是HTML5提供的一個javascript多線程解決方案,我們可以將一些大計算量的代碼交由web Worker運行而不凍結用戶界面。

一:如何使用Worker

Web Worker的基本原理就是在當前javascript的主線程中,使用Worker類加載一個javascript文件來開辟一個新的線程,起到互不阻塞執行的效果,并且提供主線程和新線程之間數據交換的接口:postMessage,onmessage。

那么如何使用呢,我們看一個例子:

//worker.jsonmessage =function (evt){  var d = evt.data;//通過evt.data獲得發送來的數據  postMessage( d );//將獲取到的數據發送會主線程}

HTML頁面:test.html

<!DOCTYPE HTML><html><head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <script type="text/javascript">//WEB頁主線程var worker =new Worker("worker.js"); //創建一個Worker對象并向它傳遞將在新線程中執行的腳本的URL worker.postMessage("hello world");     //向worker發送數據 worker.onmessage =function(evt){     //接收worker傳過來的數據函數   console.log(evt.data);              //輸出worker發送來的數據 } </script> </head> <body></body></html>

用Chrome瀏覽器打開test.html后,控制臺輸出  "hello world" 表示程序執行成功。

通過這個例子我們可以看出使用web worker主要分為以下幾部分

WEB主線程:

1.通過 worker = new Worker( url ) 加載一個JS文件來創建一個worker,同時返回一個worker實例。

2.通過worker.postMessage( data ) 方法來向worker發送數據。

3.綁定worker.onmessage方法來接收worker發送過來的數據。

4.可以使用 worker.terminate() 來終止一個worker的執行。

worker新線程:

1.通過postMessage( data ) 方法來向主線程發送數據。

2.綁定onmessage方法來接收主線程發送過來的數據。

二:Worker能做什么

知道了如何使用web worker ,那么它到底有什么用,可以幫我們解決那些問題呢。我們來看一個fibonacci數列的例子。

大家知道在數學上,fibonacci數列被以遞歸的方法定義:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*),而javascript的常用實現為: 

var fibonacci =function(n) {    return n <2? n : arguments.callee(n -1) + arguments.callee(n -2);};//fibonacci(36)

在chrome中用該方法進行39的fibonacci數列執行時間為19097毫秒 ,而要計算40的時候瀏覽器直接提示腳本忙了。

由于javascript是單線程執行的,在求數列的過程中瀏覽器不能執行其它javascript腳本,UI渲染線程也會被掛起,從而導致瀏覽器進入僵死狀態。使用web worker將數列的計算過程放入一個新線程里去執行將避免這種情況的出現。具體看例子:

//fibonacci.jsvar fibonacci =function(n) {    return n <2? n : arguments.callee(n -1) + arguments.callee(n -2);};onmessage =function(event) {    var n = parseInt(event.data, 10);    postMessage(fibonacci(n));};

HTML頁面:fibonacci.html

<!DOCTYPE HTML><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/><title>web worker fibonacci</title><script type="text/javascript">  onload =function(){      var worker =new Worker('fibonacci.js');        worker.addEventListener('message', function(event) {        var timer2 = (new Date()).valueOf();           console.log( '結果:'+event.data, '時間:'+ timer2, '用時:'+ ( timer2  - timer ) );      }, false);      var timer = (new Date()).valueOf();      console.log('開始計算:40','時間:'+ timer );      setTimeout(function(){          console.log('定時器函數在計算數列時執行了', '時間:'+ (new Date()).valueOf() );      },1000);      worker.postMessage(40);      console.log('我在計算數列的時候執行了', '時間:'+ (new Date()).valueOf() );  }    </script></head><body></body></html>

在Chrome中打開fibonacci.html,控制臺得到如下輸出:

開始計算:40 時間:1316508212705
我在計算數列的時候執行了 時間:1316508212734
定時器函數在計算數列時執行了 時間:1316508213735
結果:102334155 時間:1316508262820 用時:50115

這個例子說明在worker中執行的fibonacci數列的計算并不會影響到主線程的代碼執行,完全在自己獨立的線程中計算,只是在計算完成之后將結果發回主線程。

利用web worker我們可以在前端執行一些復雜的大量運算而不會影響頁面的展示,并且不會彈出惡心的腳本正忙提示。

下面這個例子使用了web worker來計算場景中的像素,場景打開時是一片一片進行繪制的,一個worker只計算一塊像素值。

三:Worker的其他嘗試

我們已經知道Worker通過接收一個URL來創建一個worker,那么我們是否可以利用web worker來做一些類似jsonp的請求呢,大家知道jsonp是通過插入script標簽來加載json數據的,而script元素在加載和執行過程中都是阻塞式的,如果能利用web worker實現異步加載將會非常不錯。

下面這個例子將通過 web worker、jsonp、ajax三種不同的方式來加載一個169.42KB大小的JSON數據

// /aj/webWorker/core.jsfunction $E(id) {    return document.getElementById(id);}onload =function() {    //通過web worker加載    $E('workerLoad').onclick =function() {        var url ='http://js.wcdn.cn/aj/mblog/face2';        var d = (new Date()).valueOf();        var worker =new Worker(url);        worker.onmessage =function(obj) {            console.log('web worker: '+ ((new Date()).valueOf() - d));        };    };    //通過jsonp加載    $E('jsonpLoad').onclick =function() {        var url ='http://js.wcdn.cn/aj/mblog/face1';        var d = (new Date()).valueOf();        STK.core.io.scriptLoader({            method:'post',            url : url,            onComplete : function() {                console.log('jsonp: '+ ((new Date()).valueOf() - d));            }        });    };    //通過ajax加載    $E('ajaxLoad').onclick =function() {        var url ='http://js.wcdn.cn/aj/mblog/face';        var d = (new Date()).valueOf();        STK.core.io.ajax({            url : url,            onComplete : function(json) {                console.log('ajax: '+ ((new Date()).valueOf() - d));            }        });    };};

HTML頁面:/aj/webWorker/worker.html

<!DOCTYPE HTML><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/><title>Worker example: load data</title><script src="http://js.t.sinajs.cn/STK/js/gaea.1.14.js" type="text/javascript"></script><script type="text/javascript" src="http://js.wcdn.cn/aj/webWorker/core.js"></script></head><body>    <input type="button" id="workerLoad" value="web worker加載"></input>    <input type="button" id="jsonpLoad" value="jsonp加載"></input>    <input type="button" id="ajaxLoad" value="ajax加載"></input></body></html>

設置HOST

127.0.0.1 js.wcdn.cn

通過 http://js.wcdn.cn/aj/webWorker/worker.html 訪問頁面然后分別通過三種方式加載數據,得到控制臺輸出:

web worker: 174jsonp: 25ajax: 38

多試幾次發現通過jsonp和ajax加載數據的時間相差不大,而web worker的加載時間一直處于高位,所以用web worker來加載數據還是比較慢的,即便是大數據量情況下也沒任何優勢,可能是Worker初始化新起線程比較耗時間。除了在加載過程中是無阻塞的之外沒有任何優勢。

那么web worker是否能支持跨域js加載呢,這次我們通過http://127.0.0.1/aj/webWorker/worker.html 來訪問頁面,當點擊 "web worker加載" 加載按鈕時Chrome下無任何反映,FF6下提示錯誤。由此我們可以知道web worker是不支持跨域加載JS的,這對于將靜態文件部署到單獨的靜態服務器的網站來說是個壞消息。

所以web worker只能用來加載同域下的json數據,而這方面ajax已經可以做到了,而且效率更高更通用。還是讓Worker做它自己擅長的事吧。

四:總結

web 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.不是每個瀏覽器都支持這個新特性

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩av三级在线观看| 亚洲影院色在线观看免费| 亚洲一区美女视频在线观看免费| 亚洲欧洲一区二区三区久久| 欧美激情亚洲国产| 国产精品久久久| 国产精品视频久| 国产精品极品尤物在线观看| 国产成人精品亚洲精品| 亚洲欧美国产精品| 国产91|九色| 国产精品中文字幕在线观看| 欧美成人第一页| 日韩中文视频免费在线观看| 亚洲摸下面视频| 精品国产一区二区三区久久狼5月| 国模精品一区二区三区色天香| 午夜精品久久久久久久99热| 国产91精品高潮白浆喷水| 亚洲精品欧美日韩| 国产精品自拍偷拍视频| 日韩激情在线视频| 国产精品美女呻吟| 美女撒尿一区二区三区| 中文字幕av一区二区| 久久香蕉精品香蕉| 成人免费网站在线观看| 国产精品精品国产| 亚洲免费一在线| 欧美色道久久88综合亚洲精品| 国产女人18毛片水18精品| 日韩电影免费观看在线| 青青在线视频一区二区三区| 欧美华人在线视频| 久久久久久久久国产| 亚洲国产精品美女| 91精品久久久久久久久青青| 黄色成人av在线| 久久久久九九九九| 精品性高朝久久久久久久| 国产精品极品美女粉嫩高清在线| 久久精品国产清自在天天线| 亚洲专区在线视频| 日韩综合视频在线观看| 久久久久久久电影一区| 色一情一乱一区二区| 欧美日韩国产成人| 亚洲区在线播放| 欧美怡红院视频一区二区三区| 国产经典一区二区| 亚洲成人精品av| 国产这里只有精品| 欧美在线www| 欧美大片在线看免费观看| 亚洲精品ady| 欧美激情视频网| 欧美日韩免费区域视频在线观看| 欧美精品www在线观看| 日韩视频第一页| 国产精品白嫩初高中害羞小美女| 北条麻妃久久精品| 国产精品jizz在线观看麻豆| 亚洲日本欧美中文幕| 成人在线播放av| 日韩av在线不卡| 日日噜噜噜夜夜爽亚洲精品| 亚洲成av人乱码色午夜| 亚洲人精选亚洲人成在线| 亚洲成色777777在线观看影院| 欧美成人国产va精品日本一级| 亚洲成人国产精品| 中文字幕日韩欧美在线| 欧美性xxxxhd| 色系列之999| 久久久噜噜噜久久中文字免| 97精品在线观看| 欧美激情网友自拍| 在线亚洲男人天堂| 韩国一区二区电影| 欧美性猛交99久久久久99按摩| 久久成人人人人精品欧| 国产精品扒开腿做| 国产综合在线观看视频| 国产专区精品视频| 国产xxx69麻豆国语对白| 欧美天堂在线观看| 久久久久久欧美| 欧美又大又粗又长| 亚洲国产精彩中文乱码av| 欧美理论在线观看| 日本成人免费在线| 国产一区二区动漫| 国产精品男人的天堂| 精品国模在线视频| 国产男女猛烈无遮挡91| 亚洲欧洲一区二区三区在线观看| 成人做爰www免费看视频网站| 午夜精品久久久久久久99热| 亚洲九九九在线观看| 性欧美在线看片a免费观看| 91中文字幕在线观看| 亚洲国产精品久久久久秋霞不卡| 久久免费精品日本久久中文字幕| 国产视频精品一区二区三区| 色多多国产成人永久免费网站| 粉嫩av一区二区三区免费野| 日韩欧中文字幕| 色偷偷av一区二区三区| 国产综合色香蕉精品| 成人av电影天堂| 伊人青青综合网站| 国产精品尤物福利片在线观看| 亚洲高清免费观看高清完整版| 国内精品久久久久久影视8| 欧美性视频网站| 亚洲精品一区av在线播放| 成人激情免费在线| 2019精品视频| 精品亚洲国产成av人片传媒| 91视频-88av| 日韩大陆欧美高清视频区| 日韩精品在线视频观看| 欧美在线免费看| 日韩av中文字幕在线免费观看| 亚洲风情亚aⅴ在线发布| 亚洲国产精彩中文乱码av在线播放| 国产v综合ⅴ日韩v欧美大片| 亚洲日本aⅴ片在线观看香蕉| 亚洲国产成人久久综合| 国产女人精品视频| 91美女高潮出水| 欧美高清在线视频观看不卡| 国产aⅴ夜夜欢一区二区三区| 中文字幕在线国产精品| 精品国产一区二区三区四区在线观看| 国产精品老牛影院在线观看| 一区二区三区视频免费在线观看| 中文字幕亚洲欧美一区二区三区| 欧美性受xxx| 欧美最顶级的aⅴ艳星| 欧美大片第1页| 久青草国产97香蕉在线视频| 午夜精品久久17c| 91国产在线精品| 欧美成人精品xxx| 欧美黑人巨大精品一区二区| 98精品国产自产在线观看| 亚洲视频在线观看网站| 亚洲欧美日韩精品久久奇米色影视| 欧美亚洲视频在线观看| 国产精品视频xxxx| 91久久久久久久久久久久久| 影音先锋欧美精品| 91视频国产高清| 伊人男人综合视频网| 久久久亚洲影院你懂的| 日韩在线小视频| 亚洲国产精品专区久久| 久青草国产97香蕉在线视频| 成人黄色片在线| **欧美日韩vr在线| 久久久久中文字幕2018| 亚洲精品国产综合久久| 国产午夜精品麻豆|