32

私はJavaScriptで(本物または偽の)マルチスレッドを実装するいくつかの異なる方法の比較に取り組んでいます。私の知る限り、実際のスレッドを提供できるのはWebworkersとGoogle Gears WorkerPoolだけです(つまり、実際の並列実行で複数のプロセッサに分散します)。私は次の方法を見つけました:

  • を使用してタスクを切り替えるyield()

  • setInterval()スレッドが互いに待機している状態で(または他の非ブロッキング機能)を使用する

  • Google Gears WorkerPoolスレッドを使用する(プラグイン付き)

  • html5Webワーカーを使用する

関連する質問を読んで、上記の方法のいくつかのバリエーションを見つけましたが、それらの質問のほとんどは古いので、いくつかの新しいアイデアがあるかもしれません。

私は疑問に思っています-JavaScriptでマルチスレッドを他にどのように達成できますか?他の重要な方法はありますか?

更新:コメントで指摘されているように、私が本当に意味したのは並行性でした。

更新2: Silverlight + JScriptがマルチスレッドをサポートしているという情報を見つけましたが、これを確認できません。

更新3: Googleが非推奨のGears:http ://code.google.com/apis/gears/api_workerpool.html

4

5 に答える 5

25

Webワーカー。これらはまさにこのためのW3C標準(現時点では作業中のドラフト)であり、プラグインは必要ありません。

この仕様は、Webアプリケーションの作成者がメインページと並行してスクリプトを実行するバックグラウンドワーカーを生成できるようにするAPIを定義します。

この仕様では、真の同時実行性のために、複数のコアにワーカーを分散させることについても説明しています(これはブラウザーのJavaScriptエンジンによって目に見えない形で処理されます)。

マルチコアCPUが普及するにつれ、パフォーマンスを向上させる1つの方法は、計算コストの高いタスクを複数のワーカーに分割することです。[1つの]例では、1から10,000,000までのすべての数に対して実行される計算コストの高いタスクが、10人のサブワーカーにファームアウトされます。

yield()後で発生するようにスケジュールするだけで、setInterval()他のものと同時に実行されることはありません。

于 2011-10-07T04:31:18.320 に答える
4

私は疑問に思っています-JavaScriptでマルチスレッドを他にどのように達成できますか?他の重要な方法はありますか?

コードを、明示的なループや直接の関数呼び出しを持たないJavaScriptコードに変換することができます。代わりに、コードはスレッドエンジンによって管理される小さな実行単位に分割されます。私のサンプルコードでは、ループのある関数がどのように変換されるかを示していますが、例を単純にするために、関数呼び出しのメカニズムを省略しています。

変換のプロセスは、基本的に分割ポイントでコードを分割することによって機能します。これらの除算ポイントは、関数呼び出しとループです(上記のとおり)。この例では、オブジェクトとキーを使用しましたが、ユニットがスタックをオブジェクト変数として格納した場合(つまり、this.foo = barの代わりにを使用して格納した場合)、ブラウザーのJavaScriptエンジンではるかに簡単になる可能性がありますstack["foo"] = bar

たとえば、次のコード:

// Phoney method purely to demonstrate structure
function Foo() {
  var i,
      sum = 0,
      accumulator_list = [],
      accumulator_modulus = [],
      kMaxAccumulatorCount = 100;

  // Calculate accumulations
  for(i = 0; i < kMaxAccumulatorCount; ++i) {
    current_accumulator = GetNextAccumulator()
    accumulator_list[i] = current_accumulator;
    sum = sum + current_accumulator;
  }

  // Calculate accumulator modulus
  for(i = 0; i < kMaxAccumulatorCount; ++i) {
    current_accumulator = accumulator_list[i];
    accumulator_modulus[i] = current_accumulator % kMaxAccumulatorCount;
  }
}

...このようなものに:

function Foo_A(caller,stack) {
  var stack = {};
  stack["i"] = undefined;
  stack["sum"] = 0;
  stack["accumulator_list"] = [];
  stack["accumulator_modulus"] = [];
  stack["kMaxAccumulatorCount"] = 100;

  stack["i"] = 0;
  return {caller: caller, stack: stack, next=Foo_B};
}

function Foo_B(caller, stack) {
  stack["current_accumulator"] = GetNextAccumulator();
  stack["accumulator_list"][stack["i"]] = stack["current_accumulator"];
  stack["sum"] = stack["sum"] + stack["current_accumulator"];

  // For-loop condition satisfied ?
  if(stack["i"] < stack["kMaxAccumulatorCount"]) {
    ++stack["i"];
    return {caller: caller, stack: stack, next:Foo_B};
  } else {
    // Initialise the next for loop.
    stack["i"] = 0;
    return {caller: caller, stack: stack, next:Foo_C};
  }
}

function Foo_C(caller, stack) {
  stack["current_accumulator"] = stack["current_accumulator"][stack["i"]];
  stack["accumulator_modulus"][stack["i"]] = stack["current_accumulator"] % stack["kMaxAccumulatorCount"];

  // For-loop condition satisfied ?
  if(stack["i"] < stack["kMaxAccumulatorCount"]) {
    ++stack["i"];
    return {caller: caller, stack: stack, next:Foo_C};
  } else {
    // Function has finished so the next will be null. When the thread-engine sees this it simulates the behaviour of a return, pops its virtual stack and returns execution to the caller
    return {caller: caller, stack: stack, next:null};
  }
}
于 2013-05-27T08:34:50.440 に答える
3

Multithread.jsは、JSで非常に簡単にマルチスレッド化するためのライブラリであり、Webワーカーをラップし、作業の大部分を自動的に実行します。:)

于 2014-02-28T14:47:23.253 に答える
2

JavaScriptではマルチスレッドを直接サポートしていません。ただし、これはいくつかのアイデアと方法を適用することで実現できます。

次のような方法があります。

var id = window.timeout("javascript code", time);

ここでは、JavaScriptコードが指定された時間の後に呼び出され、使用できます

window.clearTimeout(id);

クリアするため。これにより、偽の同時実行を実現できます。

于 2011-10-06T05:54:52.877 に答える
1

q:Javascriptで他にどのように並行性を達成できますか

非同期または「非ブロッキング」タイプのメソッドを使用できます。これには、node.jsシステムに関する大きな話題の1つがあります。正確にはマルチスレッドではありませんが、高速になる傾向があります。

于 2011-10-07T00:16:47.810 に答える