次のコードと、この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ワーカーを使用する方法がわかりません。