2

JavaScript Web Workers に関するドキュメントは気が遠くなるようなものです。基本的に、ブラウザが少しハングアップする重いループがあります。その重いループを別の CPU コアにオフロードできれば、アプリケーションの負荷を軽減して、よりスムーズに実行できると期待しています。単純なループを使用してグローバル変数を変更しようとしています:

var globalarr;

function webWorkerOp(CSV) {
    var lines = CSV.split("%");
    var items, obj, arr = [];

    for (var x = 0, len = lines.length; x < len; x++) {
        items = lines[x].split(",");
        obj = {};
        obj.a = +items[0];
        obj.b = +items[1];
        arr[x] = obj;
    }

    globalarr = arr;
}

コードを実行している主要なプログラムと競合することなく、このループ操作を Web ワーカーにラップするにはどうすればよいでしょうか? グローバル変数の変更は確かに問題になると思います。新しい配列をglobalarr変数に割り当てることさえ可能ですか? 助けていただければ幸いです。ありがとう!

4

1 に答える 1

2

Web ワーカーはオブジェクトwindow.globalへの参照を持たないため、Web ワーカーからを変更する方法はありません。window経由で Web ワーカーと通信できますwindow.postMessage。このアプローチを使用すると、配列をメインスレッドに戻し、そこでグローバルを設定できます。

メインスレッド

  var worker = new Worker('worker.js');
  var globalArr;

  worker.addEventListener('message', function (e) {
      globalArr = e.data;
  });

ワーカー スクリプト

// do work
var arr = [1,3,5,]
self.postMessage(arr);
于 2013-10-29T14:15:52.460 に答える