2017-03-23 46 views
0

私はNode.jsアプリケーションを持っており、同時に2つのリクエストをノードApiに送信すると、キューに入れられているように見えます。つまり、2回目のリクエストの時間は、最初のリクエストの時間に2回目のリクエストの時間を加えた時間です(リクエストを単独で起動した場合)。Node.jsが同時に複数のリクエストを処理する方法

だから私は簡単なテストでした:

app.get('/api/testpromise', function(req, res) { 

    sess = req.session; 

    var controller = new Controller(req, res, sess); 

    controller.testPromise() 
    .then(function(){ 
     controller.testPromise() 
     .then(function(){ 
      res.status(200); 
      res.json({}); 
     }); 
    }) 
}) 

testPromise()メソッドは、単にループを行います。

Controller.prototype.testPromise = function(callback){ 

    return new Promise(function(resolve, reject) { 

     var count = 0; 
     for (i = 0; i < 500000000; i++) { 
      count++; 
     } 

     if(count) { 
     resolve(count); 
     } else { 
     reject(count); 
     } 
    }); 

} 

を、私は私から同時に 'testpromise' に2つの要求をオフに解雇フロントエンドは最初に約5秒かかり、およそ10秒かかります。したがって、2番目のものは最初のものの後ろに並んでいるように見えます。

私はノードについて読んだことから、私はこのような動作を見ませんでしたか?ノードは、多くの同時リクエストを受け取り、それらを引き渡すことに本当に良いと言われています。だから、これは実際にどのように機能しますか?

+4

JSはシングルスレッドであり、Promisesを使用してもループはこのスレッドの他のコードの実行をブロックします。 [nodejsでスレッドを作成する方法](/ a/18613311/6567275) – Thomas

答えて

0

あなたのテストでは、同期コードがブロックされています。ループfor for (i = 0; i < 500000000; i++)は、完了するまで実行されるため、最初の要求は完了するまでイベントループの制御を解放しません。それはあなたのためのより良いテストはちょうどこのように

return new Promise(function(resolve, reject) { 
    setTimeout(function() { 
     resolve(5000) 
    }, 5000) // run the given function in 5000ms 
}); 

を遅らせることであろう最初は待っている間に、イベントループは、第2の要求を開始します「ビジーウェイト」のような

です。したがって、同時にリクエストすると、両方が同時に完了します。

+0

ありがとうございました。実際には私のAPIエンドポイントはMongoDbへの問い合わせを行い、それらはキューに入れられています... – Mark

+0

実際のコードを投稿するともっと助けられますが、Mongo DBへの呼び出しはNodeへの 'setTimeout()'のように機能するはずです。 Mongoがそのデータを取得している間に次のリクエストの処理を開始します。 – clay

関連する問題