Javascript 在web worker和主线程之间传递大量数据
有没有办法在web工作线程和主线程之间传递大量数据(多MB)?我在一个项目中工作,我需要下载文件,对它们进行一些修改,然后让用户下载修改后的文件。我发现了以下在web worker和主UI之间传递数据的方法Javascript 在web worker和主线程之间传递大量数据,javascript,html,web-worker,html5-filesystem,Javascript,Html,Web Worker,Html5 Filesystem,有没有办法在web工作线程和主线程之间传递大量数据(多MB)?我在一个项目中工作,我需要下载文件,对它们进行一些修改,然后让用户下载修改后的文件。我发现了以下在web worker和主UI之间传递数据的方法 使用常规的postMessage方法 使用可转移对象(仅限Chrome) 创建一个指向blob的URL引用,只发送URL(在Chrome中也可以,在其他浏览器中也可以?) 我认为(1)在发送较小的对象时很好,但在处理大于几MB的文件时需要花费大量的时间和空间,因为它是序列化的,并作为JSON
postMessage
方法self.webkitURL
创建指向blob的URL,然后只将URL引用传递给UI。这工作得很好,我可以给用户的URL,他们可以下载文件。不幸的是,我还没有在Firefox中找到这样做的方法,有可能吗
有没有其他方法可以用来在worker和主线程之间传输数据?根据这一点,webworker现在支持传递文件和Blob对象,基本上还支持任何可以与。。。或者至少Chrome做到了这一点,可能是因为它实现了文件系统API。我不知道这是否是主要原因,但我希望不是,事实上,这个功能在其他浏览器中实现。。。能够在后台处理用户选择的文件是一件好事。Firefox/Opera/Chrome目前都支持,速度非常快,安装也非常简单。在这里,我们向ww(web worker)发送一个浏览器分配的数组,该数组由ww填充并返回到浏览器端。这是通过引用传递的,而不是副本:browser ww 在浏览器端:
var huge_array = new Float32Array(BIG_HUSKY_SIZE);
// worker.postMessage(huge_array.buffer); // old way
worker.postMessage(huge_array.buffer, [huge_array.buffer]); // new Trans Obj
然后在web worker内部:
self.onmessage = function(e) {
var flt_arr = new Float32Array(e.data);
// typically you might want to populate flt_arr here
// now send data structure back to browser
// self.postMessage(flt_arr.buffer); // old way
self.postMessage(flt_arr.buffer, [flt_arr.buffer]); // new Trans Obj way
}
只需将数据对象放在方括号内[此处]
这提示js使用可转移对象模式。当来回发送包含多个变量(而不仅仅是类型化数组)的javascript对象时,这种方法也有效
:
可转移对象是指未复制的对象(例如,使用结构化克隆之类的方法)。相反,数据从一个上下文传输到另一个上下文。调用上下文中的“版本”在传输到新上下文后不再可用。例如,将ArrayBuffer从主应用程序传输到Worker时,主线程中的原始ArrayBuffer将被清除,不再可用。这大大提高了向工作者发送数据的性能
不幸的是,这仍然是一个复制操作,即使它确实提高了速度。你从哪里得到的报价?报价来自Eric Bidelman(谷歌职员),如果你点击上面URL列表顶部的“Yo dawg,这是什么?”就会出现。。。它的父链接是