javascript - 与共享 worker 一起使用可转移对象

标签 javascript web-worker transferable shared-worker message-channel

在我的共享 worker 中使用可转移对象时,我在主线程中收到 event.datanull。经过一番搜索,我找到了 this post其中解释了 ArrayBuffer 在通过 MessagePort 时总是丢失的 MessageChannel .

Shared worker 通信也是使用端口和消息 channel 完成的。这是否意味着无法在 SharedWorker 中使用可转移对象?实例?或者有什么解决方法吗?

我需要从 SharedWorkerGlobalScope 传输一个巨大的 string回到主线程。想法是将其转换为 ArrayBuffer,如 this example 所示。然后传输缓冲区。据说这比发送字符串要快得多...

发送数据:

var arrayBuffer = convertStringToArrayBuffer( string );

var data = {
    message: "here is an array buffer",
    arrayBuffer: arrayBuffer 
};

port.postMessage(data, [data.arrayBuffer]);

接收数据:

worker.port.onmessage = function( event ) {

    // data is null
    var data = event.data;

}

最佳答案

只需使用 postMessage 即可,无需转移。字符串无论如何都不可转移(因此它总是被复制)。

拥有可转让物的目标是在将对象从发送方传递到接收方时实现最低成本。这样的消息可以跨越进程边界,并且进行进程间通信是昂贵的。这是 the reason why transferables are not supported yet with MessagePort .顺便说一句,跨进程通信的困难也是Safari dropped support for SharedWorkers的原因。 .

关于javascript - 与共享 worker 一起使用可转移对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34178004/

相关文章:

javascript - 将 Javascript 链接到 HTML

javascript - 在 Dart 中编写 WebWorker(没有 dart :isolate)

java - JList 上 Transferable 和 Transferhandler 的自定义删除容器

javascript - 以尽可能少的开销通过引用将提交文件传递给 web worker

ecmascript-6 - 使用 ES6 网络 worker 的可迁移自定义类

javascript - 我想更新 .json 文件,请告诉我如何操作

javascript - 重新排列数组中对象的结构

html - 同时最大运行web worker html5

javascript - 我的 javascript web workers 在随机的地方静静地死去。我该如何调试呢?

javascript - 导致错误的reduce函数