10

2 人の Web ワーカー間で変数を共有する方法はありますか? (Web ワーカーは基本的に Javascript のスレッドです)

C# のような言語では、次のようなものがあります。

public static string message = "";
static void Main()
{
 message = "asdf";
 new Thread(mythread).Run();
}
public static void mythread()
{
 Console.WriteLine(message); //outputs "asdf"
}

これが悪い例であることは承知していますが、私の Javascript アプリケーションでは、複数のスレッドに分散できる大量の計算を実行するスレッドがあります [配列の形式で大量のデータがあるためです。配列のすべての要素は互いに独立しています。言い換えれば、私のワーカースレッドはロックなどを気にする必要はありません]

2 つのスレッド間で変数を「共有」する唯一の方法は、Getter/setter を [プロトタイピングを介して] 作成し、postMessage/onmessage を使用することであることがわかりました。 AFAIKにJSONを使用するには]

LocalStorage/Database は、デッドロックが発生する可能性があるため、HTML5 仕様から除外されました。[残念ながら] オプションではありません...

私が見つけた他の可能性は、PHP を使用して getVariable.php および setVariable.php ページを実際に作成することでした。これらのページは、localstorage を使用して ints/strings を格納します...もう一度、[配列/null を含む] オブジェクトを次のように変換する必要があります。 JSON...そしてその後、JSON.parse()'d。

私の知る限り、Javascript ワーカー スレッドはメイン ページ スレッドから完全に分離されています [これが、Javascript ワーカー スレッドが DOM 要素にアクセスできない理由です

postMessage は機能しますが、遅いです。

4

4 に答える 4

15

Web ワーカーは意図的に何も共有されません。ワーカー内のすべての情報は、他のワーカーやブラウザーのページから完全に隠されています。ワーカー間で非「アトミック」値を共有する方法があれば、それらの値のセマンティクスを使用して予測可能な結果を​​得ることはほぼ不可能です。さて、そのような値を使用する方法としてロックをある程度導入することができます -- ロックを取得し、値を調べて変更し、ロックを解放します -- しかし、ロックは非常に使いにくいです。障害モードはデッドロックです。ブラウザを簡単に「ブリック」できます。それは開発者やユーザーにとって良くありません (特にWeb 環境は、スレッド、ロック、またはメッセージ パッシングについて聞いたことさえない非プログラマーによる実験に非常に適していると考える場合)、代替手段は、ブラウザー内のワーカー間またはページ間で状態を共有しないことです。これらの問題に対処する必要なく、メッセージを渡すことができます (これはワーカーに「ネットワーク上で」シリアル化され、シリアル化された情報に基づいて元の値の独自のコピーを作成すると考えることができます)。

実際、メッセージ パッシングは、同時実行性の問題を完全に制御不能にすることなく、並列処理をサポートする正しい方法です。メッセージの受け渡しを適切に調整することで、状態を共有できるかのようにあらゆる力を発揮できるようになります。あなたは、あなたが望むと思う代替案を本当に望んでいません。

于 2010-02-18T09:03:18.023 に答える
5

いいえ。ただし、配列、オブジェクト、数値、文字列、ブール値、ImageData、またはこれらの任意の組み合わせである Web ワーカーにメッセージを送信できます。Web ワーカーもメッセージを送り返すことができます。

于 2010-02-14T21:30:23.550 に答える
2

私は最近、共有ワーカーについて読みました(ただし、使用していません) 。仕事を共有することによると!OperaにはSharedWorkerのサポートが付属しており、サポートは最新のブラウザ(Opera 10.6、Chrome 5、Safari 5)でのみ行われます。

于 2010-08-30T14:34:14.423 に答える