如何进行工人之间的沟通?

时间:2011-12-01 15:25:03

标签: javascript html5 web-worker

我正在尝试网络工作者,并且想知道他们如何处理难以置信的并行问题。因此,我实施了Connaway's Game of Life。 (比做模糊或其他事情更有趣。但是在这种情况下问题会是相同的。)

目前,我有一名网络工作人员正在执行迭代,并为UI线程发布新的ImageData以放置在我的画布中。很好地工作。

然而,我的实验并没有结束,因为我有几个CPU可用,并希望平行化我的应用程序。

所以,首先,我简单地将我的数据分成两部分,中间部分,然后让两个工人分别处理一半。问题当然是分裂。工人A需要来自工人B的一列像素,反之亦然。现在,我可以通过让我的UI线程将该列提供给worker来清楚地解决这个问题,但如果我的线程可以直接将它们传递给彼此,那就更好了。

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

我的问题是,我不知道如何实现这种从工人到工人的沟通。我尝试通过初始化postMessage将邻居交给彼此,但是这会复制我的工作人员而不是传递参考文件,幸运的是,Chrome警告我不可能。

Uncaught Error: DATA_CLONE_ERR: DOM Exception 25

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

1 个答案:

答案 0 :(得分:6)

您应该可以使用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开始使用。

相关问题