国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > HTML > 正文

針對HTML5的Web Worker使用攻略

2020-03-24 16:18:34
字體:
來源:轉載
供稿:網友
Web Workers 是 HTML5 提供的一個javascript多線程解決方案,我們可以將一些大計算量的代碼交由web Worker運行而不凍結用戶界面。
一:如何使用Worker Web Worker的基本原理就是在當前javascript的主線程中,使用Worker類加載一個javascript文件來開辟一個新的線程,起到互不阻塞執行的效果,并且提供主線程和新線程之間數據交換的接口:postMessage,onmessage。 那么如何使用呢,我們看一個例子:

JavaScript Code復制內容到剪貼板
onmessage=function(evt){ vard=evt.data;//通過evt.data獲得發送來的數據 postMessage(d);//將獲取到的數據發送會主線程 }
html span > 用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的常用實現為:
JavaScript Code復制內容到剪貼板
varfibonacci=function(n){ returnn 2?n:arguments.callee(n-1)+arguments.callee(n-2); }; //fibonacci(36)
在chrome中用該方法進行39的fibonacci數列執行時間為19097毫秒 ,而要計算40的時候瀏覽器直接提示腳本忙了。 由于javascript是單線程執行的,在求數列的過程中瀏覽器不能執行其它javascript腳本,UI渲染線程也會被掛起,從而導致瀏覽器進入僵死狀態。使用web worker將數列的計算過程放入一個新線程里去執行將避免這種情況的出現。具體看例子:

JavaScript Code復制內容到剪貼板
varfibonacci=function(n){ returnn 2?n:arguments.callee(n-1)+arguments.callee(n-2); }; onmessage=function(event){ varn=parseInt(event. span > HTML頁面:fibonacci.html

XML/HTML Code復制內容到剪貼板
span 'fibonacci.js'); worker.addEventListener('message',function(event){ vartimer2=(newDate()).valueOf(); console.log('結果:'+event. span '時間:'+timer2,'用時:'+(timer2-timer)); },false); vartimer=(newDate()).valueOf(); console.log('開始計算:40','時間:'+timer); setTimeout(function(){ console.log('定時器 span ','時間:'+(newDate()).valueOf()); },1000); worker.postMessage(40); console.log('我在計算數列的時候執行了','時間:'+(newDate()).valueOf()); } /script / span > 在Chrome中打開fibonacci.html,控制臺得到如下輸出:

開始計算:40 時間:1316508212705
我在計算數列的時候執行了 時間:1316508212734
定時器XML/HTML Code復制內容到剪貼板
span >在計算數列時執行了 時間:1316508213735
結果:102334155 時間:1316508262820 用時:50115 這個例子說明在worker中執行的fibonacci數列的計算并不會影響到主線程的代碼執行,完全在自己獨立的線程中計算,只是在計算完成之后將結果發回主線程。 利用web worker我們可以在前端執行一些復雜的大量運算而不會影響頁面的展示,并且不會彈出惡心的腳本正忙提示。 下面這個例子使用了web worker來計算場景中的像素,場景打開時是一片一片進行繪制的,一個worker只計算一塊像素值。 http://nerget.com/rayjs-mt/rayjs.html
三:Worker的其他嘗試 我們已經知道Worker通過接收一個URL來創建一個worker,那么我們是否可以利用web worker來做一些類似jsonp的請求呢,大家知道jsonp是通過插入script標簽來加載json數據的,而script元素在加載和執行過程中都是阻塞式的,如果能利用web worker實現異步加載將會非常不錯。 下面這個例子將通過 web worker、jsonp、ajax三種不同的方式來加載一個169.42KB大小的JSON數據
JavaScript Code復制內容到剪貼板
function$E(id){ returndocument.getElementById(id); } onload=function(){ //通過webworker加載 $E('workerLoad').onclick=function(){ varurl='http://js.wcdn.cn/aj/mblog/face2'; vard=(newDate()).valueOf(); varworker=newWorker(url); worker.onmessage=function(obj){ console.log('webworker:'+((newDate()).valueOf()-d)); }; }; //通過jsonp加載 $E('jsonpLoad').onclick=function(){ varurl='http://js.wcdn.cn/aj/mblog/face1'; vard=(newDate()).valueOf(); STK.core.io.scriptLoader({ method:'post', url:url, onComplete:function(){ console.log('jsonp:'+((newDate()).valueOf()-d)); } }); }; //通過 span 'ajaxLoad').onclick=function(){ varurl='http://js.wcdn.cn/aj/mblog/face'; vard=(newDate()).valueOf(); STK.core.io.ajax({ url:url, onComplete:function(json){ console.log('ajax:'+((newDate()).valueOf()-d)); } }); }; };
html span > 設置HOST


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


復制代碼代碼如下:web worker: 174
jsonp: 25
ajax: 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.不是每個瀏覽器都支持這個新特性
html教程

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 宁化县| 土默特左旗| 徐州市| 康定县| 岑巩县| 新干县| 壶关县| 荣昌县| 陇川县| 吴桥县| 柘荣县| 旬邑县| 平定县| 阜平县| 鄂托克前旗| 津市市| 祁阳县| 抚顺县| 车致| 金门县| 托里县| 崇左市| 克拉玛依市| 剑阁县| 新疆| 营山县| 绩溪县| 荥经县| 延安市| 甘孜县| 噶尔县| 新邵县| 崇左市| 旌德县| 吴忠市| 镇平县| 财经| 鹤岗市| 确山县| 湘乡市| 沅陵县|