14

Node.js を初めて使用する方からの「コード以外はすべて並行して実行される」という質問です。factorize()これは明らかに人為的な例ですが、次のように動作する関数を含む数学ライブラリを作成したいとしましょう。

var http = require('http');
http.createServer(function (req, res) {
  myMath.factorize(some_big_number,function(factors) {
    res.writeHead(200, {'Content-Type': 'application/json'});
    res.end(JSON.stringify(factors));
  }
}).listen(8000);

これを「並行して実行する」ように記述するにはどうすればよいでしょうか。

処理時間がかかる可能性がある例として、このライブラリの解析コードを見てきました。コードの本体は「あなたのコード」と見なされますか、それとも「並行して実行」されますか?

factorize()そうでない場合:ノンブロッキング/クライアントのように動作するように書くときに何をする必要がありますか? EventEmitter を使用するだけで十分ですか?

もしそうなら:この質問で提案されているように、子プロセスを使用するのが最善の選択肢ですか?

不明な点があることをあらかじめお詫び申し上げます。

4

3 に答える 3

7

node.js の JavaScript はシングル スレッドで実行されるため、実際には「並列」で実行することはできません ( workers モジュールを使用しない限り) が、シングル スレッドを小さな断片に分割できます。たとえばprocess.nextTickの場合、CPU が 1 つの長時間実行されるコードではなく小さなチャンクとしてコードを実行している場合、他のことも実行するための小さな中断があります。

myLongRunningCode(callback){
    do_a_piece_of_the_work();
    if(ready){
        callback();
    }else{
        // give the CPU a small break to do other things
        process.nextTick(function(){
            // continue working
            myLongRunningCode(callback);
        });
    }
}
于 2011-04-19T17:00:31.583 に答える
3

ノンブロッキング コードを記述するには、メッセージ パッシングを行う必要があります。

メッセージ パッシングを行うには、ストリームを開いてメッセージを渡す必要があります。これには、他のプロセスとの対話またはサブプロセスとの対話が含まれます。

ノードで重い作業を行う子プロセスを作成するか、重い作業を行う tcp/web サービスを作成できます。ノードにメッセージを渡してもらい、外部プロセスが面倒な作業を行ったときにデータを応答に送信するだけです。

于 2011-04-19T17:11:54.797 に答える
1

すべての JS コードを並行して実行することはできません。複数の関数が同時に実行されることはありません。CPU を集中的に使用するコードでは、このコードが終了するまで、プログラムは他のことを実行できなくなります。

コードを setTimeout で分割するか、別のプロセスで作業を行うことをお勧めします。しかし、これは本当に集中的なコードでなければなりません;)

于 2011-04-19T17:00:59.747 に答える