2016-09-20 12 views
0

すべて:エクスプレスハンドルCPU重い要求

私はノードおよびExpressにはかなり新しいです、私はいくつかのCPUを作り、誰がリクエストを処理する際Expressのサーバーがどのように動作するかを説明し、私を少し与えることができれば、私は、サーバーたときに捕まってしまっただろうCALC重い要求は、簡単な例:

app.get("/", function(req, res){ 
    // some long time math calculation in for loop or while to get data 
    res.json(data); 
}) 

私は、ノードは、タスクがトリガーされたイベントループベースの単一のプロセスであり、それが終了した場合、タスクはスレッドプールに入れられますが、この1つのプロセスが求め続けると思いました私の例では、私はapp.getがそのプールにハンドラ関数タスクを置いて他のリクエストを待つことができると思っていましたが、残念なことにそれはその場ではうまくいかないようですt道。

これはapp.getでどのくらい正確に機能し、この重い計算タスクをどのように分けて、このリクエストハンドラが他のリクエストを待っているのですか?

任意の例では、ブラウザのJavaScriptのように、シングルスレッドで、

おかげ

+0

メインスレッドで重い計算をしないでください、ノードクラスタを使用してください! – Ali

答えて

0

NodeJSを理解されるであろう。実行されるタスク(ハンドラ関数など)は、イベントキューに入れられ、順番に実行されます。したがって、ある関数が実行に長時間かかると、キュー内の他のもの(他の要求など)が実行されないようになります。

長時間の計算で他のリクエストが処理されないようにしたい場合は、イベントループを介して複数回にわたって分割することができます。 setImmediate()となります。 this page on the NodeJS event loopを参照してください。

(おそらく良い)オプションは、要求処理に全く干渉しないように、別のスレッド/プロセスで計算を行うことです。

+1

別のオプションは、CPUを大量に消費する操作を別のプロセスに委任することです。イベントループは、リモート操作の結果を待つ間はブロックされません。 –

+0

編集ありがとうございます。 – qxz

+0

なぜdownvote? – qxz

関連する問題