是否可以通过引用从/向主线程传递对象到webWorker?我已阅读有关可转让对象的here信息。
Chrome 13使用了向Web Worker发送ArrayBuffers 一种称为结构化克隆的算法。这允许postMessage() 用于接受不仅仅是字符串而是复杂类型的消息的API 比如File,Blob,ArrayBuffer和 JSON对象。结构化克隆就是 Firefox的更高版本也支持。
我只想传递信息,而不是通过方法传递信息。就像这样(但有很多信息,几MB,所以主线程不必接收对象的副本):
var test = {
some: "data"
}
答案 0 :(得分:2)
实际上是的,对于某些对象(see here),可能会出现(惊讶,惊喜!)Chrome 17+和Firefox 18+。
Spanish;Paella;Italian;Spagetthi;
您也可以通过使用this library将字符串转换为数组缓冲区和从数组缓冲区转换字符串来将其应用于字符串。
// 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]);
然后,将arraybuffer作为字符串读取:
//inside the worker
function post_string(the_string){
var my_array_buffer = string16.stringToArray(the_string).buffer;
postMessage( my_array_buffer, [my_array_buffer] );
}
答案 1 :(得分:1)
一旦你在对象中有一些数据(这个:{bla:666, color:"red"}
),将必须复制它,并且无法来避免它。原因是,您无法控制存储器对象存储,因此您无法传输它。唯一可以传输的内存是为可传输对象分配的内存 - 类型化数组。
因此,如果您需要传输一些数据,您必须提前考虑并使用可转移的界面。另外请记住,即使复制对象,传输速度也非常快。
我写了一个将对象转换为二进制数据的库(因此可以转移),但它并不比原生转移快,实际上它的速度要慢一些。唯一的好处是它允许我传输不支持的数据类型(例如Function
)。
答案 2 :(得分:0)
这是不可能的。您必须发送对象,在worker中更新它,然后将更新的版本返回到主线程。
如果您想仅使用信息传递对象,则只需将对象作为字符串传递
myWorker.postMessage(JSON.stringify(myObject));
解析工作者中的对象
JSON.parse(myObject)
最后将更新的对象返回到主线程。 另请参阅ParallelJs,这是使用网络工作者轻松工作的库