1. ホーム
  2. multithreading

[解決済み] node.jsで他のスレッドに影響を与えずにスレッドをスリープさせる方法とは?

2023-07-06 17:22:27

質問

以下の通りです。 node.jsのイベントループを理解する の通り、node.jsはシングルスレッドモデルをサポートしています。つまり、node.jsのサーバーに複数のリクエストをした場合、それぞれのリクエストに対して新しいスレッドを生成するのではなく、それぞれのリクエストを1つずつ実行します。 つまり、node.jsのコードで最初のリクエストに対して以下のような処理を行い、その間に新しいリクエストがnodeに来た場合、2番目のリクエストは最初のリクエストが完了するまで、5秒間のスリープ時間を含めて待機しなければならない、ということです。 そうですよね?

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

node.jsがリクエストごとに新しいスレッドを生成して、2番目のリクエストが最初のリクエストの完了を待つ必要がないようにする方法はありますか、または特定のスレッドにのみスリープを呼び出すことができますか?

どのように解決するのですか?

npm モジュールを参照している場合 スリープ を参照しているのであれば、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();