我正在试验网络 worker ,想知道他们如何处理尴尬的并行问题。因此,我实现了Connaway's Game of Life。 (比进行模糊或其他操作要有趣得多。但是,在这种情况下,问题是相同的。)

目前,我有一个Web worker 执行迭代并回发新的ImageData以便将UI线程放置在 Canvas 中。效果很好。

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

因此,首先,我将我的数据一分为二,在中间,然后让两名工作人员各负责一半。问题当然是 split 。 worker A需要来自 worker B的一列像素,反之亦然。现在,我可以通过让我的UI线程将该列归还给worker来明确解决此问题,但是如果我的线程可以将它们直接传递给彼此,那会更好。

当进一步拆分时,每个工作程序仅需跟踪其相邻工作程序,并且UI线程仅负责更新UI(应如此)。

我的问题是,我看不到如何实现这种 worker 对 worker 的沟通。我尝试通过初始化postMessage将邻居彼此传递,但这会复制我的工作人员,而不是传递引用,幸运的是chrome警告我说不可能。

Uncaught Error: DATA_CLONE_ERR: DOM Exception 25

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

最佳答案

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

关于javascript - 如何进行 worker 之间的沟通?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8343781/

10-15 14:24