1

私はnode.jsについて少し学ぶのに苦労しており、ブロックポイントに達しました(しゃれた意図はありません)。この質問は以前にもさまざまな方法で尋ねられたことに気づきましたが、それらの回答を消化したものの、まだ何かが欠けているように感じます。

以下のコードも要点にあります: https://gist.github.com/3866651

基本的に、「setTimeout called」という行がすぐに出力されるため、setTimeout 呼び出しがブロックされているとは思いません。しかし、2 つのリクエストを立て続けに処理するのに 20 秒もかかるのはなぜなのか、私は困惑しています。

私は実際に何かを逃していますか?最初の sendTimeout が応答を送信する前に、2 番目の要求を処理する方法はありますか?

「子プロセス」を見てきましたが、それはシステムコールに直接関係しているようで、javascript 関数の呼び出しには関係していないようです。

var http = require("http");

function do_thing(response, callback){
  var d=new Date();
  console.log('calling setTimeout '+d.toLocaleTimeString());
  var timer = setTimeout(function(){
    var d=new Date();
    console.log('timeout callback '+d.toLocaleTimeString());
    respond(response);
  }, 10000);
  var d2=new Date();
  console.log('setTimeout called '+d2.toLocaleTimeString());
}

function respond(response){
  var d=new Date();
  console.log('sending response '+d.toLocaleTimeString());
  response.writeHead(200, {"Content-Type": "text/plain"});
  response.write("hello at "+d.toLocaleTimeString());
  response.end();
}

http.createServer(function(request, response) {
  var d=new Date();
  console.log('got request '+d.toLocaleTimeString());
  do_thing(response, respond);
}).listen(8888);

var d=new Date();
console.log('running... '+d.toLocaleTimeString());


//Two web requests in close succession, still have to wait 20 secs for 2nd request to complete...
//OUTPUT AS FOLLOWS:
//
//running... 12:12:00
//got request 12:12:06
//calling setTimeout 12:12:06
//setTimeout called 12:12:06
//timeout callback 12:12:16
//sending response 12:12:16
//got request 12:12:16
//calling setTimeout 12:12:16
//setTimeout called 12:12:16
//timeout callback 12:12:26
//sending response 12:12:26
4

1 に答える 1

0

コードは見栄えがします。setTimeout はすぐに戻ります。内の関数は後で呼び出されます (この場合は約 10 秒)。これはうまくいくはずです。

于 2012-10-16T16:21:25.237 に答える