Javascript 通过引用从/向webworker传递对象

Javascript 通过引用从/向webworker传递对象,javascript,performance,web-worker,Javascript,Performance,Web Worker,是否可以通过引用将对象从/传递给webWorker从/传递给主线程?我读过有关可转让物品的信息 Chrome13引入了使用 一种叫做结构化克隆的算法。这允许使用postMessage() API来接受不仅仅是字符串,而且是复杂类型的消息 像File、Blob、ArrayBuffer和JSON对象。结构化克隆 在Firefox的更高版本中也受支持 我只是想传递信息,而不是用方法来反对。就像这样(但是有很多信息,只有几MB,这样主线程就不必接收对象的副本): 这是不可能的。您必须发送对象,在work

是否可以通过引用将对象从/传递给webWorker从/传递给主线程?我读过有关可转让物品的信息

Chrome13引入了使用 一种叫做结构化克隆的算法。这允许使用postMessage() API来接受不仅仅是字符串,而且是复杂类型的消息 像File、Blob、ArrayBuffer和JSON对象。结构化克隆 在Firefox的更高版本中也受支持

我只是想传递信息,而不是用方法来反对。就像这样(但是有很多信息,只有几MB,这样主线程就不必接收对象的副本):


这是不可能的。您必须发送对象,在worker中更新它,然后将更新后的版本返回到主线程

如果只想传递带有信息的对象,只需将对象作为字符串传递即可

myWorker.postMessage(JSON.stringify(myObject)); 
解析worker中的对象

JSON.parse(myObject)
最后将更新的对象返回到主线程。
再看一看,这是一个更容易使用web workers的库

一旦你在一个对象中有了一些数据(这个:
{bla:666,color:“red”}
),你将不得不复制它,并且没有办法避免它。原因是,您无法控制存储在中的内存对象,因此无法传输它。唯一可以传输的内存是分配给可传输对象类型数组的内存

因此,如果您需要传输一些数据,您必须提前考虑并使用可传输接口。还要记住,即使复制对象,传输速度也非常快

我编写了一个库,可以将对象转换为二进制数据(因此可以转移),但它并不比本机传输快,实际上慢多了。唯一的优点是它允许我传输不受支持的数据类型(例如,
函数
)。

postMessage有一个数组第二个参数 事实上是的,在(惊喜,惊喜!)Chrome17+和Firefox18+中,对于某些对象()

然后,要将arraybuffer作为字符串读取:

// var workerInstance = new Worker("/path/to/file.js");
var decoderInst = new TextDecoder;
workerInstance.onmessage = function decode_buffer(evt){
    var buffer = evt.data;
    var str = decoderInst.decode(buffer);
    console.log("From worker: " + str);
    return str;
}
下面是一个小的交互式示例,使用辅助程序递增字符串的每个字母

var incrementWorker=new Worker(“数据:text/javascript;base64,”+btoa(函数(){
//工人内部
进口文件(“https://dl.dropboxusercontent.com/s/r55397ld512etib/Encode" +
“rDecoderTogether.min.js?dl=0”);
const decoderInst=新的文本解码器;
self.onmessage=函数(evt){
常量u8Array=新的Uint8Array(evt.data);

对于(var i=0,len=u8Array.length | 0;我能解释一下为什么at的方法没有达到你想要的效果吗?是不是你想让worker和main线程同时访问内存中完全相同的对象?有没有办法将其他参数与可转移对象一起传递?例如
data={args:{foo:true},u8Array:u8Array};worker.postMessage(数据,[data])
// Create a 32MB "file" and fill it.
var uInt8Array = new Uint8Array(1024 * 1024 * 32); // 32MB
for (var i = 0; i < uInt8Array.length; ++i) {
  uInt8Array[i] = i;
}
worker.postMessage(uInt8Array.buffer, [uInt8Array.buffer]);
//inside the worker
var encoderInst = new TextEncoder;
function post_string(the_string){
    var my_array_buffer = encoderInst.encode(the_string).buffer;
    postMessage( my_array_buffer, [my_array_buffer] );
}
// var workerInstance = new Worker("/path/to/file.js");
var decoderInst = new TextDecoder;
workerInstance.onmessage = function decode_buffer(evt){
    var buffer = evt.data;
    var str = decoderInst.decode(buffer);
    console.log("From worker: " + str);
    return str;
}