【发布时间】:2013-08-14 01:08:01
【问题描述】:
我目前正在编写一个程序,我必须在其中处理巨大的数组。但是,我可以拆分这些数组。我现在的计划是,在不同的网络工作者中处理数组。然而,我从未与他们合作过,并且确实有几个问题:
1. 如何运行多个网络工作者?我尝试了一个看起来像这样的 for 循环:
for(i = 0; i < eD.threads; i++){
//start workers here
var worker = new Worker("js/worker/imageValues.js");
worker.postMessage(brightness, cD.pixels[i]);
}
我确实得到了错误,即无法克隆对象。这似乎合乎逻辑。我想将它们保存在一个数组中会更好吗?
2.我如何控制所有人都完成了工作? (我需要重新组装阵列并稍后使用它)
3.有多少网络工作者真正带来了进步?
4. 除了 MDN 入口,还有什么进阶教程吗?
谢谢!
【问题讨论】:
-
对于#2:您必须使用来自 Worker 的
postMessage向该父 JS 发送一条消息,说明 worker 已完成处理(并可能传递结果)......所以您必须在循环中为每个 Worker 添加一个onmessage侦听器。您可能会将所有这些响应存储在一个数组中。当数组中的响应数与创建的工人数相同时,这应该意味着一切都已完成......您可以处理您创建的那个数组。这可以通过使用 jQuery 的延迟对象的概念来“更干净” -
“不能被克隆”这里的意思是你传递给工人的东西不能被克隆。为了避免竞争条件,工作人员和主线程之间永远不会共享对象。对象必须要么被复制到 worker 的内存空间中,要么(使用
Blobs 和类型化数组)主线程可能会将内存空间让给 worker 并丢失对对象的引用。 -
好的。读过,但忘记了。反正。如果我在循环中创建一个临时变量,将数组作为字符串安全并传递该字符串,那会是更好的解决方案吗?我在某处读到,我只向工人发送字符串,在其他地方它说,我可以传输变量?谢谢你们的解释,帮助我开始!
-
@stiller_leser According to the spec,worker 的
postMessage可以传递几乎任何东西,除了函数和宿主对象(例如 DOM 节点)。如果您尝试传递包含函数或 DOM 节点的对象或数组,则复制将失败。
标签: javascript arrays html performance web-worker