2017-01-13 29 views
0

は、この例では、コードをNode.jsの参照:私のスクリプトでNodeJSサーバー

const http = require('http'); 

const server = http.createServer(function (req, res) { 
    if (req.url === '/loop') { 
     console.log('LOOP'); 
     while (true) {} 
    } 
    res.write('Hello World'); 
    res.end(); 
}); 

server.listen(3000); 

を各要求を処理するために、3〜5秒かかります。 while (true) {}は例です。

ここでnodejsは、処理中のリクエストが1つのときに別のリクエストを処理しません。

複数のリクエストを同時に実行したいと考えています。しかし、サーバーは一度に1つの要求しか実行していません。

注:それぞれのリクエストに対してclusterまたはchild_processを開くのは嫌いです。 nodejsはクラスタまたはchild_processを開始するために別の65 msを取ります。

+0

正確には3〜5秒かかりますか?ファイルの読み書き別のサーバーへのリクエストですか? – Molda

+0

@Moldaファジィテキスト検索のために 'fuse.js'を使って処理しています。 1,000万人以上の名前を検索するのにかかる時間がかかります。また、 'fuse.js'はプロセスを完全に同期させます。 –

答えて

0

サーバーを作成すると、nodejsがリクエストを処理するイベントループを作成します。サーバーが実行されているイベントループをブロックするので、無限ループを使用することはできません。

私はこのような要求/解像度の機能ブロック使用非同期モジュールでasync

async.map(['param1','param2','param3'], task, function(err, results) { 
    // results of task function 
}); 
のようなモジュール、そのためにあなたが利用して、あなたは無限ループを扱っていない願っていますが、時間がかかり、特定のプロセス

これは、すでに実行中のイベントループを使用してプロセスを実行することです。

ポイントはを注意します

  1. ほとんどのJavascriptのVMは、したがって、あなたはまた、代わりのsetTimeout機能を利用することができます(NodeJSを含む)、単一のスレッド化され、無限ループが
  2. あなたはすることはできませんがNodeJSでスレッドを作成する代わりに、クラスタまたは子プロセス(シングルスレッドVM)などのプロセスベースのソリューションを使用してください。
+0

しかし、 'async'モジュールは同期処理には役に立ちません。私は要求を処理するために同期プロセスを実行しています。 –

+0

は 'sync'によって出力が他のクライアントに影響を与えるかもしれないことを意味しましたか? –

+0

いいえ、他のクライアントは既存のプロセスが完了するまで待つ必要があります。 –

関連する問題