A partir de crbug.com/73313, o Chrome 13 e o FF5 oferecem suporte ao envio de uma ArrayBuffer
(ou Typed Array) para/de um Web Worker. Exemplo:
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);
Por que isso é interessante?...dados binários!
Em vez de serializar os dados postMessage()
em um objeto JSON, o navegador usa o algoritmo de clonagem estruturada para copiar o ArrayBuffer
para o contexto do worker e vice-versa. Isso abre um potencial real para os workers que ainda não vimos. Ou seja, transmitir dados binários com facilidade entre o app principal e a linha de execução do worker.
A E/S de matrizes tipadas torna a manipulação de imagens intensa, o processamento de som e os cálculos pesados do WebGL muito mais viáveis. Por exemplo, é possível ler um arquivo como um buffer de matriz ou buscar um Blob usando XHR2 e transmitir o resultado diretamente para um worker. Chega de codificar os dados em base64 :)
Na minha opinião, essa é uma daquelas coisas que os trabalhadores deveriam ter incluído desde o início. Isso faz sentido.