node.jsイベントループについて に従って、node.jsはシングルスレッドモデルをサポートします。つまり、node.jsサーバーに対して複数のリクエストを行うと、リクエストごとに新しいスレッドが生成されるのではなく、各リクエストが1つずつ実行されます。 node.jsコードの最初のリクエストに対して次のことを行い、新しいリクエストがノードに到着する間、2番目のリクエストは5秒のスリープ時間を含む最初のリクエストが完了するまで待機する必要があることを意味します。右?
var sleep = require('sleep');
sleep.sleep(5)//sleep for 5 seconds
Node.jsがリクエストごとに新しいスレッドを生成して、2番目のリクエストが最初のリクエストの完了を待つ必要がないようにする方法はありますか、または特定のスレッドでのみスリープを呼び出すことができますか?
Npmモジュール sleep を参照している場合、readmeでsleep
が実行をブロックすることに注意してください。だからあなたは正しい-それはあなたが望むものではありません。代わりに、非ブロッキングの setTimeout を使用します。以下に例を示します。
setTimeout(function() {
console.log('hello world!');
}, 5000);
Es7 async/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();
それぞれに非同期リクエストがあるループがあり、各リクエスト間に一定の時間が必要な場合は、次のコードを使用できます。
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++;
}
}
この例では、各リクエストの後に1秒待ってから次のリクエストを送信します。
deasyncモジュールを検討してください。個人的には、すべての機能を非同期にするPromiseの方法、およびキーワードasync/awaitがそこにあるのは好きではありません。そして、公式のnode.jsはイベントループAPIを公開することを検討すべきだと思います。これにより、コールバックの地獄を簡単に解決できます。 Node.jsは言語ではなくフレームワークです。
var node = require("deasync");
node.loop = node.runLoopOnce;
var done = 0;
// async call here
db.query("select * from ticket", (error, results, fields)=>{
done = 1;
});
while (!done)
node.loop();
// Now, here you go