2012-11-19 18 views
50

Understanding the node.js event loopによると、node.jsは単一のスレッドモデルをサポートします。つまり、node.jsサーバーに対して複数のリクエストを行うと、リクエストごとに新しいスレッドが生成されず、1つずつリクエストが実行されます。これは、node.jsコードの最初の要求に対して次のことを行い、新しい要求がノードに到着した場合、2番目の要求は、5秒のスリープ時間を含む最初の要求が完了するまで待機する必要があることを意味します。右?他のスレッドに影響を与えずにnode.jsのスレッドをスリープ状態にする方法はありますか?

var sleep = require('sleep'); 
    sleep.sleep(5)//sleep for 5 seconds 

2番目の要求は最初の要求が完了するのを待つ必要はありませんか、私は特定のスレッドに睡眠を呼び出すことができるようにNode.jsのは、要求ごとに新しいスレッドを生成できるという方法はありますか?

+3

あなたはそのように眠る必要はありません。代わりにsetTimeoutを参照する必要があります - > http://nodejs.org/api/globals.html#globals_settimeout_cb_ms – Alfred

答えて

92

npmモジュールsleepを参照している場合、readmeにはsleepが実行をブロックすることに注意してください。だからあなたは正しい。それはあなたが望むものではない。代わりに、非ブロックであるsetTimeoutを使用します。次に例を示します。この使用ES7を行うためにお探しの方のために

setTimeout(function() { 
    console.log('hello world!'); 
}, 5000); 

は非同期で/のawait、この例では役立つはず:

const snooze = ms => new Promise(resolve => setTimeout(resolve, ms)); 

const example = async() => { 
    console.log('About to snooze without halting the event loop...'); 
    await snooze(1000); 
    console.log('done!'); 
}; 

example(); 
+0

ですから、node.jsは一度に1つの要求を実行します。つまり、シングルスレッドモデルに従います。右? – emilly

+6

はい、1回の実行スレッドしか使用しないため、一度に1つの要求しか処理できませんが、多くの要求に対して保留中のイベントがある可能性があります。 'setTimeout'を呼び出すと、イベントがキューに格納され、次のリクエストの実行を開始できます。 5秒後にイベントがキューから削除され、コールバックが実行されます(この場合は 'console.log'を含む関数)。 –

+0

Node.jsが複数のリクエストをどのようにして相互に「待つ」ことなく実行するかの詳細については、[このスクリーンキャスト](http://nodecasts.net/episodes/1-introduction-to-nodejs)をご覧ください。 –

0

をする場合では、非同期要求の中でループを持っていますそれぞれの要求の間に一定の時間が必要な場合は、次のコードを使用できます。

var startTimeout = function(timeout, i){ 
     setTimeout(function() { 
      myAsyncFunc(i).then(function(data){ 
       console.log(data); 
      }) 
     }, timeout); 
    } 

    var myFunc = function(){ 
     timeout = 0; 
     i = 0; 
     while(i < 10){ 
      // By calling a function, the i-value is going to be 1.. 10 and not always 10 
      startTimeout(timeout, i); 
      // Increase timeout by 1 sec after each call 
      timeout += 1000; 
      i++; 
     } 
    } 

この例では、次のものを送る前に探求してください。

+0

-1。これはあなたが期待することをするつもりではありません**。ループは非同期に実行されません。それはすぐにすべての要求を起動します。非同期でループすると非常に注意してください。この組み合わせは難しいです。 – treecoder

+0

もちろん、ループは一気に呼び出されます。しかし、タイムアウトは各ループを増加させます。従って1秒... 2秒... 3秒。そのため、「myAsyncFunc」はすべてではなく、1秒ごとに呼び出されます。それは私がそれをテストするときに期待どおりに動作します。あなたはそれが間違っていると思いますか? – Jodo

+0

コードはちょっとトリッキーな仕方で動作します。 _startTimeout_関数は直ちに10回呼び出されますが、各呼び出しには1秒のタイムアウトがあり、_myAsyncFunc_の呼び出しはすべて1秒後に呼び出されます。 – greuze

関連する問題