工作人員 ♥ ArrayBuffer

crbug.com/73313 為止,Chrome 13 和 FF5 支援將 ArrayBuffer (或 Typed Array) 傳送至 Web Worker。例如:

worker.js

self.onmessage = function(e) {
    var uInt8Array = e.data;
    postMessage("Inside worker.js: uInt8Array.toString() = " + uInt8Array.toString());
    postMessage("Inside worker.js: uInt8Array.byteLength = " + uInt8Array.byteLength);
};

main.html

var uInt8Array = new Uint8Array(new ArrayBuffer(10));
for (var i = 0; i < uInt8Array.length; ++i) {
    uInt8Array[i] = i * 2; // [0, 2, 4, 6, 8,...]
}

console.log('uInt8Array.toString() = ' + uInt8Array.toString());
console.log('uInt8Array.byteLength = ' + uInt8Array.byteLength);

worker.postMessage(uInt8Array);

為什麼這麼令人興奮?...二進位資料!

瀏覽器不會將 postMessage() 資料序列化為 JSON 物件,而是使用結構化複製演算法ArrayBuffer 複製到 worker 的上下文,反之亦然。這為勞工開啟了前所未見的實質潛力。也就是說,您可以輕鬆在主要應用程式和 worker 執行緒之間傳遞二進位資料。

使用型別陣列 I/O 後,您就能更輕鬆地進行大量圖片處理、音訊處理和 WebGL 計算。舉例來說,您可以將檔案讀取為陣列緩衝區,或是使用 XHR2 擷取 Blob,然後將結果直接傳送給工作站。不再使用 Base64 編碼資料 :)

在我看來,這是工人從一開始就應該納入的瑣碎事之一。這很合理。