dedicated worker

Dedicated worker 僅能被產生它的檔案來存取,底下的範例為傳入一個含有 2 個數值與 1 筆文字的串列 (list) 傳入 worker,並透過 worker 進行相成與相加,文字則是不作處理,然後在前端頁面顯示出這些結果。

偵測瀏覽器是否支援 Worker 功能


因 web worker 在早期流覽器並無法支援,因此可以透過下列程式碼進行確認是否支援;

if (window.Worker) {
  // ...
}

產生 dedicated worker


透過呼叫 Worker() 建構子,並傳入 .js 檔案的 URL 便可以產生一個 worker 執行緒。

var myworker = new Worker('dworker.js');

向 dedicated worker 傳送訊息


  • 前端頁面 (或稱父頁面) 可以透過 postMessage() 方法向 worker 執行緒傳送訊息 (即必要傳入參數值)。
  • 前端頁面 (或稱父頁面) 則可透過 onmessage() 方法取得來自 worker 執行後的結果 (即取得結果)。
if(window.Worker) {
    // send the worker values
    myworker.postMessage([2,5,"text"]);
    alert('post message');

    // get values from the worker
    myworker.onmessage = function(e) {
        alert('message from dwork : ' + e.data);
    }
}

然後我們可以在 worker 執行緒中實作處理來自前端頁面的參數値;

  • 透過 onmessage() 接收訊息,並進行處理
  • 執行完後,在透過 postMessage() 傳送訊息回去給前端,並由前端的 onmessage() 取得來自 worker 的資料
  • 當然,此 worker 執行緒亦可以引用不同的 javascript 函式庫,並可以透過 importScripts() 來引用;底下為被 worker 引用的函式庫的內容 (檔名為 lib.js);
// 此內容存放在名為 lib.js 的檔案中
function mulValue(num1, num2) {
    return (num1+num2);
}

底下為實作 worker 內容的方法 (檔名為 dworker.js );

// 引用不同的 javascript 檔案
importScripts('lib.js');

// worker 執行的結果
onmessage = function(e) {
    console.log('Message from main script');
    var workerResult = 'Multiply : ' + (e.data[0] * e.data[1]) + ' ; msg is ' + e.data[2] + ' ; Plus : ' + mulValue(e.data[0], e.data[1]);
    console.log('Post message to main script');
    postMessage(workerResult);
}
註解
需要注意的是,不論是 (1) 由前端傳入 worker 的參數值或是 (2) 取得來自 worker 的計算結果,皆是將資料 (包含傳入資料與取得資料) 內容存放在 data 屬性中,且不論傳入或是取得資料,皆是以複製的方式進行,而非分享方式 (即傳值非傳址)。

結束 dedicated worker


  • 方法一:可以在前端頁面中呼叫 terminate() 來結束 worker,如下;
myWorker.terminate();
  • 方法二:在 worker 執行緒中,可以自己呼叫 close() 方法來結束執行緒,如下;
close();
註解
需要注意的是不論 worker 正在執行的運算完成與否,一但呼叫結束指令後,worker 便會終止。

引用程式腳本與函式庫 (library)


Worker 執行緒能透過 importScripts() 來存取一個全域函數或載入外部資源,如下範例;

// 引用單一個 js 腳本檔案
importScripts('example.js');                

// 引用多個 js 腳本檔案
importScripts('lib.js', 'example.js');

完整範例程式碼


  • 前端 javascript (.js),檔名為 worker.html
<script type="text/javascript">

var myworker = new Worker('dworker.js');

if(window.Worker) {
    myworker.postMessage([2,5,"text"]);
    alert('post message');

    myworker.onmessage = function(e) {
        alert('message from dwork : ' + e.data);
    }
}
//myworker.terminate();
</script>
  • 被 worker 引用的函式庫,檔名為 lib.js
function mulValue(num1, num2) {
    return (num1+num2);
}
  • worker 執行緒,檔名為 dworker.js
importScripts('lib.js');

onmessage = function(e) {
    console.log('Message from main script');
    var workerResult = 'Multiply : ' + (e.data[0] * e.data[1]) + ' ; msg is ' + e.data[2] + ' ; Plus : ' + mulValue(e.data[0], e.data[1]);
    console.log('Post message to main script');
    postMessage(workerResult);
}

results matching ""

    No results matching ""