36

リソースを集中的に使用する JS で実行したいタスクがいくつかあります。この質問では、システム アクセスではなく、重い計算であると仮定します。ここで、タスク A、B、および C を同時に実行し、これが完了したら関数 D を実行したいと考えています。

非同期ライブラリは、これに適した足場を提供します。

async.parallel([A, B, C], D);

私がしているのは単なる計算である場合、これは引き続き同期的に実行されます(ライブラリがタスクを別のスレッド自体に配置していない限り、そうではないと思います)。これを実際に並列にするにはどうすればよいですか?(NodeJS を使用する場合) 呼び出し元をブロックしないために非同期コードによって通常行われることは何ですか? 子プロセスを開始していますか?

4

5 に答える 5

15

非同期と並列は同じものではありません。非同期とは、同期を待つ必要がないことを意味します。並列とは、同時に複数のことを実行できることを意味します。Node.js は非同期のみですが、スレッドは 1 つだけです。一度に 1 つのことしか実行できません。長時間実行される計算がある場合は、別のプロセスを開始してから、node.js プロセスを非同期で結果を待機させる必要があります。

これを行うには、child_process.spawn を使用して、標準入力からデータを読み取ることができます。

http://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options

var spawn = require('child_process').spawn;
var process2 = spawn('sh', ['./computationProgram', 'parameter'] );

process2.stderr.on('data', function (data) {
    //handle error input
});

process2.stdout.on('data', function (data) {
    //handle data results
});
于 2013-10-01T15:47:18.867 に答える
6

I/O は Node.js によって並列化されることに注意してください。JavaScript コールバックのみがシングル スレッドです。

サーバーを作成していると仮定すると、生成プロセスまたは分岐の複雑さを追加する代わりに、単純にステートレス ノード サーバーを構築し、コアごとにインスタンスを実行するか、さらにはそれぞれ独自の仮想化されたマイクロ サーバーで多数のインスタンスを実行することをお勧めします。リバース プロキシまたはロード バランサーを使用して、着信要求を調整します。

MongoDB (MapReduce を使用) や Hadoop など、別のサーバーに計算をオフロードすることもできます。

本当にハードコアになるには、C++ で Node プラグインを作成し、計算コードの並列化をきめ細かく制御できます。とにかく、C++ からの高速化により、並列化の必要性がなくなる可能性があります。

数値計算に最も適した別の言語で、計算集約的なタスクを実行するコードをいつでも記述できます。たとえば、REST API を介してそれらを公開できます。

node-cuda最後に、計算の種類に応じて、または同様のものを使用して GPU でコードを実行できます(すべてを GPU 用に最適化できるわけではありません)。

はい、他のプロセスを fork して生成することはできますが、ノードの主な利点の 1 つは、並列化とスレッド化についてあまり心配する必要がないことです。

于 2013-10-01T20:21:45.280 に答える
4

ユースケースに応じて、次のようなものを使用できます

task.js CPU を集中的に使用するコードをすべてのコア (node.js および web) で実行するための簡素化されたインターフェース

例は

function blocking (exampleArgument) {
    // block thread
}

// turn blocking pure function into a worker task
const blockingAsync = task.wrap(blocking);

// run task on a autoscaling worker pool
blockingAsync('exampleArgumentValue').then(result => {
    // do something with result
});
于 2016-10-28T17:01:44.103 に答える
2

つい最近、parallel.js に出くわしましたが、実際にはマルチコアを使用しているようで、map reduce 型の機能も備えています。 http://adambom.github.io/parallel.js/

于 2014-01-08T14:30:30.237 に答える