HTML5 worker 多線程

測試閱讀器: FF 3.6
  測試效勞器: APACHE 2.2
  
  先讓我們去夢想下假如WEB頁裏上能用多線程,那是否是意味那WEB頁裏逐步代替了客戶端?
  html5 標準
  
  好了切進正題,那末WEB的多線程究竟是個蝦米?
  
  從字裏上去看,我們該當看的出他的完成是WORKER形式吧,甚麼是WORKER形式?
  寫過量線程的同窗該當比我更分明,年夜體的概念是:線程的創立由一個WORKER去決議,維護了一個線程池。
  
  接着,我們看下HTML5的多線扯菪甚麼特性的:
  
  1. 正在線程中是不克不及操做DOM節面的(念要操做的話只能發送動靜給worker創立者回調函數)
  2. 多線程的素質實際上是真實的體系線程
  3. 能利用setTimeout(), clearTimeout(), setInterval(),clearInterval()等函數
  4. 能停止IO操做(ajax)
  
  worker大抵的流程是如許子的:
     創立一個worker對象,綁定一個領受後臺處理動靜的辦法 onmessage 戰一個錯誤處理辦法 onerror 。利用postMessage去通報數據,那個辦法的參數是嚴厲的JSON對象。當後臺處理完利用postMessage辦法將數據傳回前臺,也便是onmessage的辦法。
  
  接下去看例子:
  
  那個例子是頁裏通報一個數讓後臺減3,然後正在頁裏隱示
  
  挪用者:
  
[color=amily:Consolas,'Courier]

[JAVAscript] view plaincopy




< !DOCTYPE html>  
< html>  
    <head><title>worker Test</title>  
    <meta http-equiv="pragma" content="no-cache"></meta>  
    <meta http-equiv="expires" content="-1"></meta>  
    <meta http-equiv="cache-control" content="no-cache"></meta>  
    </head>  
    <body>  
        <div id="result" >zz</div>  
    </body>  
    <mce:script type="text/javascript"><!--  
        var worker = new Worker("work.js");   
        worker.onmessage = function(event){  
            document.write(event.data);  
        };  
        worker.onerror = function(event){  
            alert(event.message);  
        };  
        worker.postMessage(1);  
      
// --></mce:script>  
< /html>  

  
  
  上裏的代碼 創立了一個worker對象,然後初初化onmessage 戰 onerror的辦法,最初傳進一個整數1
  
  接着我們去看下worker.js的內容
  
[color=amily:Consolas,'Courier]

[javascript] view plaincopy




onmessage = function(event) {  
    var data = event.data+3;  
    postMessage(data);  
};  

  
  
  因爲work.js實鄰Worker上下僞甭的,以是能間接利用 postMessage.
  一旦利用了那個辦法,那末它以下的代碼將沒有執止,假如念要完成輪迴的話,建議利用setInterval
  並且Worker出有鎖的機造,多線程的同步問題只能靠代碼去處理(好比界說旌旗燈號變量)
  
  
  那裏借值得一提的是 worker摯ボ再有子worker 好比以下代碼:
  
  
[color=amily:Consolas,'Courier]

[javascript] view plaincopy




var symbol = false;  
var obj ;  
var i = 0 ;  
onmessage = function(event) {  
        obj = event.data;  
        callWorker();  
};  
setInterval(function(){  
        if(i == 10) {  
                postMessage(obj);  
        }  
},100);  
callWorker = function(){  
        var worker = new Worker("sub.js");  
        worker.onmessage = function(event){  
                obj.a = event.data;  
                i = 10;  
        };  
        worker.onerror = function(event){  
                throw e;  
        };  
        worker.postMessage(1);  
};  

  
  
  sub.js
  
[color=amily:Consolas,'Courier]

[javascript] view plaincopy




onmessage = function(event){  
        postMessage(7);  
};  

   
  轉載註明:http://www.shengshiyouxi.com  
   沙脈例子正在女的worker中挪用子worker:利用setInterval的辦法等候i的值由子線程改動爲10,然後返回迪瞥裏
  
  那裏借值得留意的辦法有兩個close 戰 terminate
  close 是worker本人銷譽本人
  terminate是worker創立者銷譽worker
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章