2011-12-01 28 views
9

我正在试验网络工作者,并想知道他们会如何处理不平行的问题。因此我实施了Connaway's Game of Life。 (要有一点比做模糊更有趣,但是在这种情况下问题会是一样的)如何进行工人与工人的沟通?

目前我有一个Web工作人员执行迭代并发布新的ImageData for UI线程放在我的画布上。很好地工作。

但是,我的实验并没有结束,因为我有几个CPU可用,并且想并行化我的应用程序。

所以,首先简单地说,我将数据分成两部分,中间是两部分,每部分分别处理一半。问题当然是分裂。工作者A需要来自工人B的一列像素,反之亦然。现在,我可以明确地解决这个问题,让我的UI线程将这个列给工人,但是如果我的线程可以直接将它们传递给eachother,那会更好。

当进一步分裂时,每个工作人员只需要跟踪它的邻居工作人员,UI线程只负责更新UI(它应该是)。

我的问题是,我没有看到我如何实现这种工人对工作者的沟通。我尝试通过初始化postMessage将邻居交给海誓山盟,但那会复制我的工作者而不是传递引用,幸运的是,chrome警告我不可能。

Uncaught Error: DATA_CLONE_ERR: DOM Exception 25 

最后我看到有一种叫做SharedWorker的东西。这是我应该看看,还是有办法使用Worker可以解决我的问题?

回答

5

您应该能够使用channel messaging

var channel = new MessageChannel(); 
worker1.postMessage({code:"port"}, [channel.port1]); 
worker2.postMessage({code:"port"}, [channel.port2]); 

然后在您的工作线程:

var xWorkerPort; 
onmessage = function(event) { 
    if (event.data.code == "port") { 
     xWorkerPort = event.ports[0]; 
     xWorkerPort.onmessage = function(event) { /* do stuff */ }; 
    } 
} 

没有太多的文档身边,但你可以尝试this MS summary上手。

+0

感谢您的回答@robertc,我完全忘记了这一点。我想我应该在这上面花点时间。 – Mithon

+0

消息通道如何对工作人员通信有用 –

+0

在Firefox出现此错误消息之前,这将无法使用:https://bugzilla.mozilla.org/show_bug.cgi?id = 911972 – Adria