Firefox/Opera/Chrome 目前都支持一种称为 Transferable Objects 的网络工作者,它速度极快 - 也极易设置。在这里,我们向 ww(网络工作者)发送一个浏览器分配的数组,该数组由 ww 填充并返回给浏览器端。这是通过引用传递的,而不是副本:浏览器 <-> ww
在浏览器端:
var huge_array = new Float32Array(BIG_HUSKY_SIZE);
// worker.postMessage(huge_array.buffer); // old way
worker.postMessage(huge_array.buffer, [huge_array.buffer]); // new Trans Obj
然后在网络工作者内部:
self.onmessage = function(e) {
var flt_arr = new Float32Array(e.data);
// typically you might want to populate flt_arr here
// now send data structure back to browser
// self.postMessage(flt_arr.buffer); // old way
self.postMessage(flt_arr.buffer, [flt_arr.buffer]); // new Trans Obj way
}
通过简单地将数据对象放在方括号 [in here] 中,这会提示 js 使用 Transferable Object 模式。这也适用于来回发送包含多个变量的 javascript 对象,而不仅仅是类型化数组。
引用:
可转移对象是不被复制的对象(例如使用结构化克隆之类的东西)。相反,数据从一个上下文传输到另一个上下文。调用上下文中的“版本”在转移到新上下文后不再可用。例如,当将一个 ArrayBuffer 从主应用程序传输到 Worker 时,主线程中的原始 ArrayBuffer 被清除并且不再可用。这极大地提高了向 Worker 发送数据的性能
http://html5-demos.appspot.com/static/workers/transferables/index.html
https://html.spec.whatwg.org/multipage/workers.html