pbootcms网站模板|日韩1区2区|织梦模板||网站源码|日韩1区2区|jquery建站特效-html5模板网

HTML5 Web Worker的使用

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

       一:如何使用Worker

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

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

  1. //worker.js
  2. onmessage =function (evt){
  3.   var d = evt.data;//通過evt.data獲得發送來的數據
  4.   postMessage( d );//將獲取到的數據發送會主線程
  5. }
復制代碼

       HTML頁面:test.html

  1. <!DOCTYPE HTML>
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
  5. <script type="text/javascript">
  6. //WEB頁主線程
  7. var worker =new Worker("worker.js"); //創建一個Worker對象并向它傳遞將在新線程中執行的腳本的URL
  8. worker.postMessage("hello world");     //向worker發送數據
  9. worker.onmessage =function(evt){     //接收worker傳過來的數據函數
  10.    console.log(evt.data);              //輸出worker發送來的數據
  11. }
  12. </script>
  13. </head>
  14. <body></body>
  15. </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的常用實現為:

  1. var fibonacci =function(n) {
  2.     return n <2? n : arguments.callee(n -1) + arguments.callee(n -2);
  3. };
  4. //fibonacci(36)
復制代碼

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

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

  1. //fibonacci.js
  2. var fibonacci =function(n) {
  3.     return n <2? n : arguments.callee(n -1) + arguments.callee(n -2);
  4. };
  5. onmessage =function(event) {
  6.     var n = parseInt(event.data, 10);
  7.     postMessage(fibonacci(n));
  8. };
復制代碼

       HTML頁面:fibonacci.html

  1. <!DOCTYPE HTML>
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
  5. <title>web worker fibonacci</title>
  6. <script type="text/javascript">
  7.   onload =function(){
  8.       var worker =new Worker('fibonacci.js');  
  9.       worker.addEventListener('message', function(event) {
  10.         var timer2 = (new Date()).valueOf();
  11.            console.log( '結果:'+event.data, '時間:'+ timer2, '用時:'+ ( timer2  - timer ) );
  12.       }, false);
  13.       var timer = (new Date()).valueOf();
  14.       console.log('開始計算:40','時間:'+ timer );
  15.       setTimeout(function(){
  16.           console.log('定時器函數在計算數列時執行了', '時間:'+ (new Date()).valueOf() );
  17.       },1000);
  18.       worker.postMessage(40);
  19.       console.log('我在計算數列的時候執行了', '時間:'+ (new Date()).valueOf() );
  20.   }  
  21.   </script>
  22. </head>
  23. <body>
  24. </body>
  25. </html>
復制代碼

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

  1. 開始計算:40 時間:1316508212705
  2. 我在計算數列的時候執行了 時間:1316508212734
  3. 定時器函數在計算數列時執行了 時間:1316508213735
  4. 結果: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數據

  1. // /aj/webWorker/core.js
  2. function $E(id) {
  3.     return document.getElementById(id);
  4. }
  5. onload =function() {
  6.     //通過web worker加載
  7.     $E('workerLoad').onclick =function() {
  8.         var url ='http://js.wcdn.cn/aj/mblog/face2';
  9.         var d = (new Date()).valueOf();
  10.         var worker =new Worker(url);
  11.         worker.onmessage =function(obj) {
  12.             console.log('web worker: '+ ((new Date()).valueOf() - d));
  13.         };
  14.     };
  15.     //通過jsonp加載
  16.     $E('jsonpLoad').onclick =function() {
  17.         var url ='http://js.wcdn.cn/aj/mblog/face1';
  18.         var d = (new Date()).valueOf();
  19.         STK.core.io.scriptLoader({
  20.             method:'post',
  21.             url : url,
  22.             onComplete : function() {
  23.                 console.log('jsonp: '+ ((new Date()).valueOf() - d));
  24.             }
  25.         });
  26.     };
  27.     //通過ajax加載
  28.     $E('ajaxLoad').onclick =function() {
  29.         var url ='http://js.wcdn.cn/aj/mblog/face';
  30.         var d = (new Date()).valueOf();
  31.         STK.core.io.ajax({
  32.             url : url,
  33.             onComplete : function(json) {
  34.                 console.log('ajax: '+ ((new Date()).valueOf() - d));
  35.             }
  36.         });
  37.     };
  38. };
復制代碼

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

  1. <!DOCTYPE HTML>
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
  5. <title>Worker example: load data</title>
  6. <script src="http://js.t.sinajs.cn/STK/js/gaea.1.14.js" type="text/javascript"></script>
  7. <script type="text/javascript" src="http://js.wcdn.cn/aj/webWorker/core.js"></script>
  8. </head>
  9. <body>
  10.     <input type="button" id="workerLoad" value="web worker加載"></input>
  11.     <input type="button" id="jsonpLoad" value="jsonp加載"></input>
  12.     <input type="button" id="ajaxLoad" value="ajax加載"></input>
  13. </body>
  14. </html>
復制代碼

       設置HOST

  1. 127.0.0.1 js.wcdn.cn
復制代碼

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

  1. web worker: 174
  2. jsonp: 25
  3. 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.不是每個瀏覽器都支持這個新特性

【網站聲明】本站除付費源碼經過測試外,其他素材未做測試,不保證完整性,網站上部分源碼僅限學習交流,請勿用于商業用途。如損害你的權益請聯系客服QQ:2655101040 給予處理,謝謝支持。

相關文檔推薦

這篇文章主要介紹了詳解HTML5 window.postMessage與跨域,非常具有實用價值,需要的朋友可以參考下
由于實際運行環境是在瀏覽器中,因此性能還取決于JavaScript解釋器的效率,指定的FPS幀速在低性能解釋器中可能不會達到,所以這部分不是開發者能夠決定的,開發者能作的是盡可能通
本文將使用HTML5提供的VideoAPI做一個自定義的視頻播放器,需要用到HTML5提供的video標簽、以及HTML5提供的對JavascriptAPI的擴展。,HTML5中國,中國最大的HTML5中文門戶。
隨著 Hybrid 應用的豐富,HTML5 工程師們已經不滿足于把桌面端體驗簡單移植到移動端,他們覬覦移動原生應用人性化的操作體驗,特別是原生應用與生俱來的豐富的手勢系統。HTML5 沒有提
你想要在自己網站上分享一個產品,或者是一個作品集,又或者僅僅只是一個靈感。在你發布到網上之前,你想讓它看起來有吸引力,專業,或者至少得看起來像那么回事。那么你接下
這篇文章主要介紹了Html5 web本地存儲實例詳解的相關資料,需要的朋友可以參考下
主站蜘蛛池模板: 砂石生产线_石料生产线设备_制砂生产线设备价格_生产厂家-河南中誉鼎力智能装备有限公司 | 美的商用净水器_美的直饮机_一级代理经销商_Midea租赁价格-厂家反渗透滤芯-直饮水批发品牌售后 | 一体化净水器_一体化净水设备_一体化水处理设备-江苏旭浩鑫环保科技有限公司 | 全国国际化学校_国际高中招生_一站式升学择校服务-国际学校网 | 洁净化验室净化工程_成都实验室装修设计施工_四川华锐净化公司 | 药品仓库用除湿机-变电站用防爆空调-油漆房用防爆空调-杭州特奥环保科技有限公司 | 全自动包装秤_全自动上袋机_全自动套袋机_高位码垛机_全自动包装码垛系统生产线-三维汉界机器(山东)股份有限公司 | YT保温材料_YT无机保温砂浆_外墙保温材料_南阳银通节能建材高新技术开发有限公司 | 刘秘书_你身边专业的工作范文写作小秘书| 雷冲击高压发生器-水内冷直流高压发生器-串联谐振分压器-武汉特高压电力科技有限公司 | 自清洗过滤器,浅层砂过滤器,叠片过滤器厂家-新乡市宇清净化 | 橡胶接头|可曲挠橡胶接头|橡胶软接头安装使用教程-上海松夏官方网站 | 沈阳真空机_沈阳真空包装机_沈阳大米真空包装机-沈阳海鹞真空包装机械有限公司 | 双工位钻铣攻牙机-转换工作台钻攻中心-钻铣攻牙机一体机-浙江利硕自动化设备有限公司 | 新型游乐设备,360大摆锤游乐设备「诚信厂家」-山东方鑫游乐设备 新能源汽车电池软连接,铜铝复合膜柔性连接,电力母排-容发智能科技(无锡)有限公司 | 【连江县榕彩涂料有限公司】官方网站 | 密度电子天平-内校-外校电子天平-沈阳龙腾电子有限公司 | 酒糟烘干机-豆渣烘干机-薯渣烘干机-糟渣烘干设备厂家-焦作市真节能环保设备科技有限公司 | 磁力链接搜索神器_BT磁力狗_CILIMAO磁力猫_高效磁力搜索引擎2024 | 武汉天安盾电子设备有限公司 - 安盾安检,武汉安检门,武汉安检机,武汉金属探测器,武汉测温安检门,武汉X光行李安检机,武汉防爆罐,武汉车底安全检查,武汉液体探测仪,武汉安检防爆设备 | 成都顶呱呱信息技术有限公司-贷款_个人贷款_银行贷款在线申请 - 成都贷款公司 | 工业铝型材生产厂家_铝合金型材配件批发精加工定制厂商 - 上海岐易铝业 | 花纹铝板,合金铝卷板,阴极铝板-济南恒诚铝业有限公司 | 东莞螺杆空压机_永磁变频空压机_节能空压机_空压机工厂批发_深圳螺杆空压机_广州螺杆空压机_东莞空压机_空压机批发_东莞空压机工厂批发_东莞市文颖设备科技有限公司 | 户外环保不锈钢垃圾桶_标识标牌制作_园林公园椅厂家_花箱定制-北京汇众环艺 | 钢木实验台-全钢实验台-化验室通风柜-实验室装修厂家-杭州博扬实验设备 | 高低温万能试验机_拉力试验机_拉伸试验机-馥勒仪器科技(上海)有限公司 | 高低温万能试验机_拉力试验机_拉伸试验机-馥勒仪器科技(上海)有限公司 | 小小作文网_中小学优秀作文范文大全| 招商帮-一站式网络营销服务|互联网整合营销|网络推广代运营|信息流推广|招商帮企业招商好帮手|搜索营销推广|短视视频营销推广 | 开业庆典_舞龙舞狮_乔迁奠基仪式_开工仪式-神挚龙狮鼓乐文化传媒 | 舞台木地板厂家_体育运动木地板_室内篮球馆木地板_实木运动地板厂家_欧氏篮球地板推荐 | 液压扳手-高品质液压扳手供应商 - 液压扳手, 液压扳手供应商, 德国进口液压拉马 | 实体店商新零售|微赢|波后|波后合作|微赢集团 | 喷漆房_废气处理设备-湖北天地鑫环保设备有限公司 | 杭州高温泵_热水泵_高温油泵|昆山奥兰克泵业制造有限公司 | 济南菜鸟驿站广告|青岛快递车车体|社区媒体-抖音|墙体广告-山东揽胜广告传媒有限公司 | 郑州爱婴幼师学校_专业幼师培训_托育师培训_幼儿教育培训学校 | 附着力促进剂-尼龙处理剂-PP处理剂-金属附着力处理剂-东莞市炅盛塑胶科技有限公司 | 吸污车_吸粪车_抽粪车_电动三轮吸粪车_真空吸污车_高压清洗吸污车-远大汽车制造有限公司 | 广州物流公司_广州货运公司_广州回程车运输 - 万信物流 |