8

次のコードと、このMozillaチュートリアル「Webワーカーの使用」の説明を考慮してください。

var myWorker = new Worker('my_worker.js');
myWorker.onmessage = function(event) {
  print("Called back by the worker!\n");
};

この例の1行目は、ワーカースレッドを作成して実行を開始します。 2行目では、ワーカーのonmessageハンドラーを、ワーカーが独自のpostMessage()関数を呼び出すときに呼び出される関数に設定しています。

スレッドは、 Workerコンストラクターが呼び出された瞬間に開始されます。onmessageハンドラーの設定に競合状態があるのではないかと思います。たとえば、onmessageが設定される前にWebワーカーがメッセージを投稿した場合です。

誰かがこれについてもっと知っていますか?

アップデート:

Andreyは、MozillaチュートリアルのFibonacciの例のように、Webワーカーがメッセージを受信したときに作業を開始する必要があると指摘しました。しかし、それはWebワーカーでonmessageハンドラーを設定する際の新しい競合状態を作成しませんか?

例えば:

メインスクリプト:

var myWorker = new Worker('worker.js');
myWorker.onmessage = function(evt) {..};
myWorker.postMessage('start');

Webワーカースクリプト('worker.js')

var result = [];
onmessage = function(evt) {..};

次に、次の実行パスを検討します。

main thread                                  web worker
var worker = new Worker("worker.js");
                                             var result = [];
myWorker.onmessage = ..
myWorker.postMessage('start');
                                             onmessage = ..

" var result = [] "行は省略できますが、それでも同じ効果があります。

これは有効な実行パスです。Webワーカーでタイムアウトを設定して試してみました。現時点では、競合状態に陥ることなくWebワーカーを使用する方法がわかりません。

4

1 に答える 1

5

答えは、メインスクリプトとWebワーカーの両方に、最初のワーカースクリプトが戻る前にメッセージを収集するMessagePortキューがあるということです。

詳細については、WHATWGヘルプメーリングリストの次のスレッドを参照してください:http: //lists.whatwg.org/pipermail/help-whatwg.org/2010-August/000606.html

于 2010-08-05T15:34:52.523 に答える