javascript - 传输 TypedArrays 的正确方法?

标签 javascript web-worker

给定像 Uint8Array 这样的类型化数组,似乎有两种方法可以通过 worker 传输它们。

选项 1

直接发送缓冲区并在接收端进行转换:

发件人:postMessage({fooBuffer: foo.buffer}, [foo.buffer])

接收器:const bar = new Uint8Array(msg.data.fooBuffer)

选项 2

发送 TypedArray 并只传输其缓冲区:

发件人:postMessage({foo: foo}, [foo.buffer])

接收器:按原样使用 foo


在我看来,选项 2 更可取,因为接收方不需要知道数据的类型,而且它的代码更少——但我一直只遇到选项 1 风格的示例。

更重要的是,在我当前的代码中,只有选项 2 有效。我已确认数据已传输,因为仅在发送后,foo[0] 才变为未定义。

使用选项 2 可以吗,即使它不是我看到的示例代码的标准?

最佳答案

差异完全微不足道。如果你传递类型化数组,你真正传递的只是关于它是什么类型的信息。无论如何,将使用移动的缓冲区创建数组 View 的新实例。

所以这真的取决于您的需求。 Either way works, check this fiddle .

index.js

var worker = new Worker(url);

worker.addEventListener("error", function(e) {
    console.warn("Worker error:", e);
});
worker.addEventListener("messageerror", function(e) {
    console.warn("Message error:", e);
});

var arrayBuffer = new Float64Array([1,2,3,4,5]).buffer;
var array = new Float64Array([1,2,3,4,5])
worker.postMessage({name:"buffer", data:arrayBuffer}, [arrayBuffer]);
worker.postMessage({name:"array", data:array}, [array.buffer]);

worker.js

  self.onmessage = function(e) {
    switch(e.data.name) {
      case "buffer" : 
          console.log("Array buffer:", new Float64Array(e.data.data))
      break;
      case "array": 
          console.log("Array:", e.data.data);
          break;
      default:
        console.error("Unknown message:", e.data.name);
    }
  }

关于javascript - 传输 TypedArrays 的正确方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47417756/

相关文章:

Heroku:防止工作进程重新启动?

javascript - Vue.js eslint 解析错误。 : unexpected token

javascript - 按日期过滤 Angular 排序

javascript - 单 View 页面永久链接为空,带有 Iron Router

javascript - 在 TestRail 中集成 Cypress

Highcharts 同构渲染/网络 worker

javascript - 使用 CSP 在 Web Worker 中启用 'new Function'

javascript - Web Workers - 如果对象按值传递,则内存使用量会增加一倍

javascript - Web Workers 可以 100% 地利用多核 CPU 吗?

javascript - Vega-Lite 中的平行坐标?