ホームページ > ウェブフロントエンド > jsチュートリアル > 平行javaScriptを使用したパラレルJavaScript

平行javaScriptを使用したパラレルJavaScript

Christopher Nolan
リリース: 2025-02-18 08:51:09
オリジナル
223 人が閲覧しました

paralleljs:エレガントなWebワーカーソリューション

Paralleljsは、Webワーカーを使用するときに発生する可能性のある問題に対するエレガントなソリューションを提供し、便利な抽象化とヘルパーツールを備えた実用的なAPIを提供します。 HTML5によって導入されたワーカーインターフェイスにより、長期的な時間と高い計算需要で機能を作成できます。これは、ウェブサイトの応答速度を改善するために同時に使用できます。 ParalleljsはJavaScriptコードの並列化を可能にし、同時マルチスレッド(SMT)を活用して、最新のCPUをより効率的に使用します。 ParallelJSライブラリは、計算、プロセスデータ、および断片化の断片化の結果を並行して実行するために使用されるspawnmapなどのメソッドを提供します。 reduce

HTML5が提起した最もクールな新しい可能性の1つは、Web Workers APIのワーカーインターフェイスです。その前に、ユーザーに応答性の高いWebサイトを示すためにいくつかのヒントを採用する必要がありました。ワーカーインターフェイスにより、長期的な時間と高い計算需要で関数を作成できます。さらに、労働者インスタンスを同時に使用することができ、必要に応じてこれらの労働者の任意の数を生成できるようになります。この記事では、マルチスレッドが重要である理由と、Paralleljsを使用してJavaScriptに実装する方法について説明します。

なぜマルチスレッドが必要なのですか?

これは合理的な質問です。歴史的に、スレッドを生成する機能は、プロセスで作業を分割するエレガントな方法を提供します。オペレーティングシステムは、各スレッドで利用可能な時間をスケジュールする責任があるため、優先度が高く、ワークロードが高いスレッドは、優先度の低いアイドルスレッドよりも優先されます。過去数年間で、同時マルチスレッド(SMT)が最新のCPUコンピューティングパワーにアクセスする鍵となっています。その理由は単純です。ムーアの法則は、単位面積あたりのトランジスタの数に関して依然として有効です。ただし、さまざまな理由で周波数スケーリングを停止する必要があります。したがって、利用可能なトランジスタは他の方法で使用する必要があります。建築の改善(SIMDなど)やマルチコアが最良の選択であることが決定されています。

Parallel JavaScript with ParallelJS s

は次の式で与えられていると述べています。

ここで、Parallel JavaScript with ParallelJS n

は並列労働者の数(プロセッサ、コア、またはスレッドなど)であり、

pは並列部分です。将来的には、並列アルゴリズムに依存するより多くのマルチコアアーキテクチャを使用できます。高性能コンピューティングの分野では、GPUシステムとIntel Xeon Phiなどの特別なアーキテクチャは、そのようなプラットフォームを表しています。最後に、一般的な同時アプリケーションまたはアルゴリズムと並列実行を区別する必要があります。並列性は、計算の(おそらく関連性の高い)同時実行です。逆に、同時性は独立した実行プロセスの組み合わせです。 JavaScriptのマルチスレッド

JavaScriptでは、同時プログラムの作成方法、つまりコールバック関数を使用する方法を既に知っています。この知識は、並列プログラムの作成に移行できるようになりました!独自の構造によれば、JavaScriptは、イベントループ(通常は反応器パターンに従う)によって媒介される単一のスレッドで実行されます。たとえば、これにより、(外部)リソースへの非同期リクエストを処理するための優れた抽象化が提供されます。また、以前に定義されたコールバックが常に同じ実行スレッドで常に起動されることを保証します。クロススレッドの例外、人種条件、またはスレッドに関連するその他の問題はありません。ただし、これはJavaScriptのSMTに近づくことはありません。ワーカーインターフェイスの導入により、エレガントなソリューションが見つかりました。主なアプリケーションの観点から、Webワーカーのコードは、同時に実行されるタスクと見なされる必要があります。このようにコミュニケーションも実施されます。メッセージAPIを使用します。これは、含まれるWebサイトからホストされたページまでの通信にも使用できます。たとえば、次のコードは、イニシエーターにメッセージを送信することにより、着信メッセージに応答します。

window.addEventListener('message', function (event) {
    event.source.postMessage('Howdy Cowboy!', event.origin);
}, false);
ログイン後にコピー
ログイン後にコピー

理論的には、Webワーカーは別のWebワーカーを生成することもできます。ただし、実際、ほとんどのブラウザはこれを禁止しています。したがって、Webワーカー間で通信する唯一の方法は、メインアプリケーションを使用することです。メッセージによる通信は同時に行われるため、非同期(非ブロッキング)通信のみが実行されます。最初は、これはプログラミングでは奇妙かもしれませんが、多くの利点をもたらします。最も重要なことは、私たちのコードには人種条件がないはずです! 2つのパラメーターを使用してシーケンスの開始と終了を表して、バックグラウンドで一連の素数を計算する簡単な例を見てみましょう。まず、次のコンテンツを含むprime.jsというファイルを作成します。

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));
}
ログイン後にコピー
ログイン後にコピー
かなりの作業がたくさんあります。特に迷惑なのは、別のファイルを使用することです。これは素晴らしい分離をもたらしますが、小さなタスクでは完全に冗長に見えます。幸いなことに、解決策があります。次のコードを検討してください:

もちろん、そのような魔法の数字(13および14)よりも優れたソリューションが必要な場合があり、ブラウザに応じて、BlobとCreateObjecturlのフォールバックを使用する必要があります。あなたがJavaScriptの専門家でない場合、Fsubstr(13、fs.length -14)は関数本体を抽出することです。これを行い、関数宣言を文字列(toString()で呼び出す)に変換し、関数自体の署名を削除します。
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
ログイン後にコピー

paralleljsは役立ちますか?

これは、Paralleljsが出てくる場所です。これは、Webワーカーだけでなく、ある程度の利便性のために素晴らしいAPIを提供します。多くの補助ツールと非常に便利な抽象化が含まれています。最初に処理するデータを提供します。

データフィールドは、提供された配列を生成します。 「並列」操作はまだ呼ばれていません。ただし、インスタンスPには、新しいWebワーカーが作成されるSpawnなどのメソッドのセットが含まれています。それは約束を返し、それが結果を風にするものにします。
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は、Webワーカーを使用するときに発生する可能性のある問題を回避するためのエレガントな方法を提供します。さらに、いくつかの便利な抽象化とヘルパーを備えた素敵なAPIを取得します。将来、さらなる改善を統合できます。 JavaScriptでSMTを使用できることに加えて、ベクトル化を使用することもできます。サポートされている場合、Simd.jsは実行可能なアプローチのようです。一部の(できればそれほど遠くない)未来では、コンピューティングにGPUを使用することも有効なオプションになる場合があります。 node.jsには、cuda(並列コンピューティングアーキテクチャ)のラッパーがありますが、元のJavaScriptコードはまだ不可能です。それまでは、Paralleljsは、マルチコアCPUを利用して長期にわたるコンピューティングを処理するための最良の選択でした。あなたも? JavaScriptを使用して、最新のハードウェアの力を解き放ちますか?

Paralleljsを使用したParalleljs上の

Paralleljsとは何ですか?それはどのように機能しますか?

Paralleljsは、マルチコアプロセッサを活用してデータ処理を並列化できるJavaScriptライブラリです。新しい並列オブジェクトを作成し、それに一連のデータを渡すことで機能します。このデータは、アレイ内の各アイテムに指定された関数を適用する

メソッドを使用して並行して処理できます。次に、結果を新しい配列で返します。 .map()

paralleljsをインストールする方法は?

paralleljsは、npm(node.jsパッケージマネージャー)を使用してインストールできます。端末にコマンド「npmインストールparalleljs」を実行するだけです。インストールが完了したら、「var parallel = require( 'paralleljs');」を使用してJavaScriptファイルに参照できます。

Paralleljsを使用することの利点は何ですか?

Paralleljsを使用すると、マルチコアプロセッサでデータ処理タスクを最大限に活用できます。これにより、大規模なデータセットの処理時間を大幅に高速化できます。また、並列化コードを簡単にするシンプルで直感的なAPIも提供します。

ブラウザでParalleljsを使用できますか?

はい、パラレルJSをブラウザで使用できます。 ScriptタグとParallelJSファイルのURLを使用して、HTMLファイルに含めることができます。含まれると、node.jsのように並列オブジェクトを使用できます。

並行して.map()メソッドを使用する方法は?

Paralleljsのメソッドは、データ配列の各アイテムに関数を適用するために使用されます。この関数は、文字列として.map()メソッドに渡されます。次に、結果を新しい配列で返します。たとえば、「var p = new parallem([1、2、3]); p.map( 'function(n){return n * 2;}');」 ]新しい配列。 .map()

並列jsの

メソッドは何ですか? .reduce()

ParallelJSのメソッドは、指定された関数を使用してデータの配列を単一の値に削減するために使用されます。この関数は、文字列として

メソッドに渡されます。たとえば、「var p = new paralled([1、2、3]); p.reduce( 'function(a、b){return a b;}');」 .reduce() .reduce()並列jsでメソッドをリンクできますか?

はい、並列jsのメソッドをリンクできます。たとえば、

メソッドを使用してデータを処理してから、

メソッドを使用して結果を単一の値に結合できます。 .map() .reduce()パラレルJでエラーを処理する方法は?

ParallelJSのエラーは、

メソッドを使用して処理できます。この方法は、処理中にエラーが発生した場合に呼び出される関数を受け入れます。エラーオブジェクトはこの関数に渡されます。

.catch()他のJavaScriptライブラリとParalleljsを使用できますか?

はい、Paralleljsは他のJavaScriptライブラリで使用できます。ただし、

メソッドを使用して、ワーカーコンテキストにライブラリを含めることを確認する必要があります。

.require() Paralleljsはすべてのデータ処理タスクに適していますか?

Paralleljsは大規模なデータセットの処理時間を大幅に高速化できますが、すべてのタスクに最適な選択肢ではない場合があります。小さなデータセットの場合、労働者の作成とデータの転送のオーバーヘッドは、並列化の利点を上回る可能性があります。特定のユースケースで平行JSをテストして、パフォーマンスの利点を提供するかどうかを確認することをお勧めします。

以上が平行javaScriptを使用したパラレルJavaScriptの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート