10

我正在尝试使用网络工作者,并且想知道他们将如何处理令人尴尬的并行问题。因此,我实施了 Connaway 的 Game of Life。(比做模糊或其他事情更有趣。但是在那种情况下问题是一样的。)

目前,我有一个网络工作者执行迭代并为 UI 线程发回新的 ImageData 以放置在我的画布中。效果很好。

然而,我的实验并没有就此结束,因为我有几个可用的 CPU 并且想要并行化我的应用程序。

因此,首先,我将我的数据分成两部分,从中间向下,让两个工人每人处理一半。问题当然是分裂。工人 A 需要来自工人 B 的一列像素,反之亦然。现在,我可以通过让我的 UI 线程将该列交给工作人员来清楚地解决这个问题,但如果我的线程可以直接将它们传递给彼此会更好。

当进一步拆分时,每个工作人员只需要跟踪它的相邻工作人员,并且 UI 线程将只负责更新 UI(应该如此)。

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

Uncaught Error: DATA_CLONE_ERR: DOM Exception 25

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

4

1 回答 1

6

您应该能够使用频道消息传递

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 */ };
    }
}

周围没有太多文档,但您可以尝试这个 MS 摘要来开始。

于 2011-12-02T12:43:39.960 回答