paralleljs:エレガントなWebワーカーソリューション
Paralleljsは、Webワーカーを使用するときに発生する可能性のある問題に対するエレガントなソリューションを提供し、便利な抽象化とヘルパーツールを備えた実用的なAPIを提供します。 HTML5によって導入されたワーカーインターフェイスにより、長期的な時間と高い計算需要で機能を作成できます。これは、ウェブサイトの応答速度を改善するために同時に使用できます。 ParalleljsはJavaScriptコードの並列化を可能にし、同時マルチスレッド(SMT)を活用して、最新のCPUをより効率的に使用します。 ParallelJSライブラリは、計算、プロセスデータ、および断片化の断片化の結果を並行して実行するために使用されるspawn
、map
、reduce
なぜマルチスレッドが必要なのですか?
これは合理的な質問です。歴史的に、スレッドを生成する機能は、プロセスで作業を分割するエレガントな方法を提供します。オペレーティングシステムは、各スレッドで利用可能な時間をスケジュールする責任があるため、優先度が高く、ワークロードが高いスレッドは、優先度の低いアイドルスレッドよりも優先されます。過去数年間で、同時マルチスレッド(SMT)が最新のCPUコンピューティングパワーにアクセスする鍵となっています。その理由は単純です。ムーアの法則は、単位面積あたりのトランジスタの数に関して依然として有効です。ただし、さまざまな理由で周波数スケーリングを停止する必要があります。したがって、利用可能なトランジスタは他の方法で使用する必要があります。建築の改善(SIMDなど)やマルチコアが最良の選択であることが決定されています。
は次の式で与えられていると述べています。
ここで、 pは並列部分です。将来的には、並列アルゴリズムに依存するより多くのマルチコアアーキテクチャを使用できます。高性能コンピューティングの分野では、GPUシステムとIntel Xeon Phiなどの特別なアーキテクチャは、そのようなプラットフォームを表しています。最後に、一般的な同時アプリケーションまたはアルゴリズムと並列実行を区別する必要があります。並列性は、計算の(おそらく関連性の高い)同時実行です。逆に、同時性は独立した実行プロセスの組み合わせです。
JavaScriptのマルチスレッド JavaScriptでは、同時プログラムの作成方法、つまりコールバック関数を使用する方法を既に知っています。この知識は、並列プログラムの作成に移行できるようになりました!独自の構造によれば、JavaScriptは、イベントループ(通常は反応器パターンに従う)によって媒介される単一のスレッドで実行されます。たとえば、これにより、(外部)リソースへの非同期リクエストを処理するための優れた抽象化が提供されます。また、以前に定義されたコールバックが常に同じ実行スレッドで常に起動されることを保証します。クロススレッドの例外、人種条件、またはスレッドに関連するその他の問題はありません。ただし、これはJavaScriptのSMTに近づくことはありません。ワーカーインターフェイスの導入により、エレガントなソリューションが見つかりました。主なアプリケーションの観点から、Webワーカーのコードは、同時に実行されるタスクと見なされる必要があります。このようにコミュニケーションも実施されます。メッセージAPIを使用します。これは、含まれるWebサイトからホストされたページまでの通信にも使用できます。たとえば、次のコードは、イニシエーターにメッセージを送信することにより、着信メッセージに応答します。 理論的には、Webワーカーは別のWebワーカーを生成することもできます。ただし、実際、ほとんどのブラウザはこれを禁止しています。したがって、Webワーカー間で通信する唯一の方法は、メインアプリケーションを使用することです。メッセージによる通信は同時に行われるため、非同期(非ブロッキング)通信のみが実行されます。最初は、これはプログラミングでは奇妙かもしれませんが、多くの利点をもたらします。最も重要なことは、私たちのコードには人種条件がないはずです! 2つのパラメーターを使用してシーケンスの開始と終了を表して、バックグラウンドで一連の素数を計算する簡単な例を見てみましょう。まず、次のコンテンツを含むprime.jsというファイルを作成します。
paralleljsは役立ちますか? これは、Paralleljsが出てくる場所です。これは、Webワーカーだけでなく、ある程度の利便性のために素晴らしいAPIを提供します。多くの補助ツールと非常に便利な抽象化が含まれています。最初に処理するデータを提供します。
上記のコードの問題は、計算が実際に並行していないことです。データの配列全体を一度に処理する単一の背景ワーカーのみを作成します。完全な配列を処理した後にのみ、結果を取得できます。より良い解決策は、並列インスタンスのマップ関数を使用することです。 前の例では、コアは非常に単純で、単純すぎる可能性があります。実際の例では、多くの操作と機能が関与します。必要な関数を使用して、インポートされた関数を含めることができます。 機能は、断片化された結果を単一の結果に集約するのに役立ちます。これは、すべてのサブレクストを知った後、サブルルトを収集し、特定の操作を実行するための便利な抽象化を提供します。 結論 Paralleljsは、Webワーカーを使用するときに発生する可能性のある問題を回避するためのエレガントな方法を提供します。さらに、いくつかの便利な抽象化とヘルパーを備えた素敵なAPIを取得します。将来、さらなる改善を統合できます。 JavaScriptでSMTを使用できることに加えて、ベクトル化を使用することもできます。サポートされている場合、Simd.jsは実行可能なアプローチのようです。一部の(できればそれほど遠くない)未来では、コンピューティングにGPUを使用することも有効なオプションになる場合があります。 node.jsには、cuda(並列コンピューティングアーキテクチャ)のラッパーがありますが、元のJavaScriptコードはまだ不可能です。それまでは、Paralleljsは、マルチコアCPUを利用して長期にわたるコンピューティングを処理するための最良の選択でした。あなたも? JavaScriptを使用して、最新のハードウェアの力を解き放ちますか? メソッドを使用して並行して処理できます。次に、結果を新しい配列で返します。
Paralleljsの メソッドに渡されます。たとえば、「var p = new paralled([1、2、3]); p.reduce( 'function(a、b){return a b;}');」 メソッドを使用して結果を単一の値に結合できます。
n
window.addEventListener('message', function (event) {
event.source.postMessage('Howdy Cowboy!', event.origin);
}, false);
onmessage = function (event) {
var arguments = JSON.parse(event.data);
run(arguments.start, arguments.end);
};
function run (start, end) {
var n = start;
while (n < end) {
var k = Math.sqrt(n);
var found = false;
for (var i = 2; !found && i <= k; i++) {
found = n % i === 0;
}
if (!found) {
postMessage(n.toString());
}
n++;
}
}
if (typeof Worker !== 'undefined') {
var w = new Worker('prime.js');
w.onmessage = function(event) {
console.log(event);
};
var args = { start : 100, end : 10000 };
w.postMessage(JSON.stringify(args));
}
var fs = (function () {
/* code for the worker */
}).toString();
var blob = new Blob(
[fs.substr(13, fs.length - 14)],
{ type: 'text/javascript' }
);
var url = window.URL.createObjectURL(blob);
var worker = new Worker(url);
// Now setup communication and rest as before
var p = new Parallel([1, 2, 3, 4, 5]);
console.log(p.data);
window.addEventListener('message', function (event) {
event.source.postMessage('Howdy Cowboy!', event.origin);
}, false);
onmessage = function (event) {
var arguments = JSON.parse(event.data);
run(arguments.start, arguments.end);
};
function run (start, end) {
var n = start;
while (n < end) {
var k = Math.sqrt(n);
var found = false;
for (var i = 2; !found && i <= k; i++) {
found = n % i === 0;
}
if (!found) {
postMessage(n.toString());
}
n++;
}
}
if (typeof Worker !== 'undefined') {
var w = new Worker('prime.js');
w.onmessage = function(event) {
console.log(event);
};
var args = { start : 100, end : 10000 };
w.postMessage(JSON.stringify(args));
}
Paralleljsは、マルチコアプロセッサを活用してデータ処理を並列化できるJavaScriptライブラリです。新しい並列オブジェクトを作成し、それに一連のデータを渡すことで機能します。このデータは、アレイ内の各アイテムに指定された関数を適用する.map()
paralleljsは、npm(node.jsパッケージマネージャー)を使用してインストールできます。端末にコマンド「npmインストールparalleljs」を実行するだけです。インストールが完了したら、「var parallel = require( 'paralleljs');」を使用してJavaScriptファイルに参照できます。
Paralleljsを使用すると、マルチコアプロセッサでデータ処理タスクを最大限に活用できます。これにより、大規模なデータセットの処理時間を大幅に高速化できます。また、並列化コードを簡単にするシンプルで直感的なAPIも提供します。
はい、パラレルJSをブラウザで使用できます。 ScriptタグとParallelJSファイルのURLを使用して、HTMLファイルに含めることができます。含まれると、node.jsのように並列オブジェクトを使用できます。
並行して
.map()
メソッドを使用する方法は? .map()
メソッドに渡されます。次に、結果を新しい配列で返します。たとえば、「var p = new parallem([1、2、3]); p.map( 'function(n){return n * 2;}');」 ]新しい配列。 .map()
メソッドは何ですか?
ParallelJSの.reduce()
.reduce()
.reduce()
並列jsでメソッドをリンクできますか? はい、並列jsのメソッドをリンクできます。たとえば、
メソッドを使用してデータを処理してから、.map()
.reduce()
パラレルJでエラーを処理する方法は? ParallelJSのエラーは、
メソッドを使用して処理できます。この方法は、処理中にエラーが発生した場合に呼び出される関数を受け入れます。エラーオブジェクトはこの関数に渡されます。 .catch()
他のJavaScriptライブラリとParalleljsを使用できますか? はい、Paralleljsは他のJavaScriptライブラリで使用できます。ただし、
メソッドを使用して、ワーカーコンテキストにライブラリを含めることを確認する必要があります。 .require()
Paralleljsはすべてのデータ処理タスクに適していますか? Paralleljsは大規模なデータセットの処理時間を大幅に高速化できますが、すべてのタスクに最適な選択肢ではない場合があります。小さなデータセットの場合、労働者の作成とデータの転送のオーバーヘッドは、並列化の利点を上回る可能性があります。特定のユースケースで平行JSをテストして、パフォーマンスの利点を提供するかどうかを確認することをお勧めします。
以上が平行javaScriptを使用したパラレルJavaScriptの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。