5

node.jsは初めてですが、setTimeoutを使用して長い接続をシミュレートし、非同期で動作することを期待しました。

var http = require('http');

http.createServer(function (request, response) {
    console.log('New request @ ' + request.url);
    (function (response) {
         setTimeout(function () {
             console.log('Time is up');
             response.writeHead(200, {"Content-Type": "text/plain"});
             response.end('Hello World\n');
         }, 3000);
     })(response);
}).listen(8124);

console.log('Server running at http://127.0.0.1:8124/');

ただし、上記のコードは、同期シングルスレッドアプリのように機能し、3秒ごとに1つのリクエストしか処理できません。

node.jsのすべてが非同期で動作するはずだと思いました。それで、ここでの問題は何ですか?

4

3 に答える 3

8

これSetTimeoutは非同期です。途中で匿名関数を使用する必要はありません。これを記述してください。

var http = require('http');

http.createServer(function (request, response) {
  console.log('New request @ ' + request.url);
  setTimeout(function () {
    console.log('Time is up');
    response.writeHead(200, {"Content-Type": "text/plain"});
    response.end('Hello World\n');
  }, 3000);
}).listen(8124);

console.log('Server running at http://127.0.0.1:8124/');

10個の同時リクエストを生成した場合、合計comp時間は約3秒になります。これは、非同期であることを意味します。abツールを使用してチェックするか、ノードをプログラムする場合は、http-perfをインストールする方が簡単です。実行しますnperf -c 10 -n 10 http://127.0.0.1:8124

于 2012-12-20T11:54:24.363 に答える
0

あなたは新しいプロセスであなたの睡眠を実行する必要があります。あなたを助けることができるモジュールがあります(https://github.com/cramforce/node-worker)、またはあなたはスポーンについての通常のAPIドキュメントを見ることができます。

于 2012-12-20T11:37:42.903 に答える
-3

var async、
__slice = [] .slice;

async = require( "async");

async.setTimeOut = function(){
    var arg、args、callback、delay、runWithTimeOut;
    コールバック=引数[0]、遅延=引数[1]、引数=引数[2]、引数= 4 <=引数.length?__slice.call(arguments、3):[];
    runWithTimeOut = function(){
        return setTimeout(callback、delay、arg、args);
    };

    async.parallel([runWithTimeOut]);を返します。
};

于 2014-01-26T23:18:49.323 に答える