10

私はWebワーカーを実験していて、彼らが恥ずかしいほど並行した問題にどれだけうまく対処できるのか疑問に思っていました。したがって、私はコナウェイのライフゲームを実装しました。(ぼかしなどを行うよりも少し楽しくすること。ただし、その場合も問題は同じです。)

現在、1人のWebワーカーが反復を実行し、UIスレッドの新しいImageDataをポストバックしてキャンバスに配置しています。うまく動作します。

しかし、私の実験はそれだけではありません。いくつかのCPUが利用可能であり、アプリケーションを並列化したいと考えているからです。

したがって、最初に、データを2つに分割し、中央を下にして、2人のワーカーがそれぞれ半分を処理するようにします。もちろん問題は分割です。ワーカーAにはワーカーBからの1列のピクセルが必要であり、その逆も同様です。これで、UIスレッドにその列をワーカーに渡させることでこれを明確に修正できますが、スレッドがそれらを直接相互に渡すことができれば、はるかに優れています。

さらに分割すると、各ワーカーは隣接するワーカーを追跡するだけで済み、UIスレッドはUIの更新のみを担当します(そうあるべきです)。

私の問題は、この労働者間のコミュニケーションをどのように達成できるかわからないことです。初期化postMessageを使用してネイバーを相互に渡そうとしましたが、参照を渡すのではなく、ワーカーをコピーすることになり、幸いなことにchromeが不可能であると警告しました。

Uncaught Error: DATA_CLONE_ERR: DOM Exception 25

最後に、と呼ばれるものがあることがわかります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 に答える