工作器 ♥ ArrayBuffer

Eric Bidelman

crbug.com/73313 起,Chrome 13 和 FF5 支持向 Web Worker 发送 ArrayBuffer(或类型化数组)。例如:

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);

为什么如此令人兴奋?...二进制数据!

浏览器会使用结构化克隆算法ArrayBuffer 复制到 worker 的上下文(反之亦然),而不是将 postMessage() 数据序列化为 JSON 对象。这为员工带来了前所未有的巨大潜力。也就是说,能够轻松地在主应用和工作线程之间传递二进制数据。

类型化数组 I/O 使密集图像处理、声音处理和繁重的 WebGL 计算更加可行。例如,您可以以数组缓冲区形式读取 File,或使用 XHR2 提取 Blob,并将结果直接传递给 worker。不再需要对数据进行 base64 编码 :)

在我看来,这是工人从一开始就应该包含的挑衅之一。有道理。