2011-12-01 15 views
9

私はウェブワーカーを試していて、恥ずかしそうにパラレルな問題にどれほどうまく対処できるのだろうかと思っていました。私はConnaway's Game of Lifeを実装しました。ワーカーとワーカーのやりとりをするには?

現時点では、私は1人のWebワーカーが繰り返しを実行し、UIスレッドの新しいImageDataをポストバックしています私のキャンバスに置く。うまく動作します。

私の実験は終わりではありませんが、いくつかのCPUがあり、アプリケーションを並列化したいからです。

私はまずデータを2つに分割し、途中でデータを分割し、2つのデータをそれぞれ半分ずつ処理します。問題はもちろん分割です。作業者Aは、作業者Bからの1列のピクセルを必要とし、その逆もあります。今、私は明らかにこれを修正することができます私のUIスレッドは、作業者にその列を与えるが、私のスレッドが直接お互いにそれらを渡すことができればもっと良いでしょう。

さらに分割すると、各ワーカーはそのワーカーを追跡するだけで済み、UIスレッドはUIを更新する責任を負うことになります。

私の問題は、私はこのワーカーと労働者のコミュニケーションをどのように達成できるかわかりません。私は初期化postMessageの方法でお互いに隣人を渡そうとしましたが、それは幸いなことに私に不可能であることを警告した参照を渡すよりも、私のワーカーをコピーするでしょう。

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

関連する問題