与共享工作人员一起使用可转移对象

Use transferable objects with a shared worker

本文关键字:可转移 对象 一起 共享 工作人员      更新时间:2023-09-26

在共享工作线程中使用可转移对象时,我在主线程中接收null代替event.data。经过一番搜索,我找到了这篇文章,其中解释了ArrayBuffer在通过MessageChannelMessagePort时总是丢失。

共享工作者通信也使用端口和消息通道来完成。这是否意味着无法在SharedWorker实例中使用可转移对象?或者有什么变通办法?

我需要将一个巨大的stringSharedWorkerGlobalScope传输回主线程。其思想是将其转换为ArrayBuffer,如本例所示,然后传输缓冲区。这应该比发送字符串快得多。。。

发送数据:

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而不使用可转移项。字符串无论如何都是不可转移的(所以它总是被复制的)。

具有可转移性的目标是在将对象从发送方传递到接收方时具有最小的成本。这样的消息可以跨越进程边界,并且进行进程间通信是昂贵的。这就是MessagePort尚不支持可传输内容的原因。顺便说一句,跨流程通信的困难也是Safari放弃对SharedWorkers支持的原因。