ホームページ > ウェブフロントエンド > jsチュートリアル > Node.js で真にノンブロッキング関数を記述するにはどうすればよいですか?

Node.js で真にノンブロッキング関数を記述するにはどうすればよいですか?

Mary-Kate Olsen
リリース: 2024-12-04 19:11:13
オリジナル
259 人が閲覧しました

How to Write Truly Non-Blocking Functions in Node.js?

Node.js でノンブロッキング関数を記述する正しい方法

ノンブロッキング パラダイムは、Node.js で次のことを達成するために重要です。高いパフォーマンス。ただし、イベント ループの進行を妨げない真のノンブロッキング関数を記述するのは難しい場合があります。

ノンブロッキングの動作を理解する

Promise でのコードのラップ本質的にノンブロッキングにするわけではありません。 Promise executor 関数は同期的に実行されます。つまり、その中の長時間実行コードが他の操作の実行をブロックします。

例: Promise ラップされたブロッキング関数

考慮してください次の関数:

function longRunningFunc(val, mod) {
    return new Promise((resolve, reject) => {
        let sum = 0;
        for (let i = 0; i < 100000; i++) {
            for (let j = 0; j < val; j++) {
                sum += i + j % mod;
            }
        }
        resolve(sum);
    });
}
ログイン後にコピー

この関数は Promise を返しますが、コードはexecutor 内でブロックされています。イベント ループは、他の操作を実行する前に、このコードが完了するまで待機します。

setTimeout を使用した非同期性のシミュレーション

この場合、非ブロッキング動作をエミュレートする 1 つのアプローチは、以下を使用することです。 setTimeout:

function longRunningFunc(val, mod) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            let sum = 0;
            for (let i = 0; i < 100000; i++) {
                for (let j = 0; j < val; j++) {
                    sum += i + j % mod;
                }
            }
            resolve(sum);
        }, 10);
    });
}
ログイン後にコピー

このコードは、長時間実行ループの実行後に実行するようにスケジュールします。 10ミリ秒の遅延。ただし、遅延実行期間内は依然としてブロックされています。

真のノンブロッキング アプローチ

真にノンブロッキング関数を作成するには、コードを移動する手法を使用する必要があります。メイン Node.js スレッド外での実行:

  • Childプロセス: 長時間実行タスクを処理するための別のプロセスを作成します。
  • ワーカー スレッド: Node.js の実験的なワーカー スレッド機能を利用して、単一プロセス内に複数のスレッドを作成します。
  • ネイティブ コード: 非同期システムを使用する C またはその他のネイティブ コード拡張機能を作成します。
  • 既存の非同期 API: fs.readFile によるファイル I/O、http.get による HTTP リクエストなど、Node.js コア モジュールによって提供される非同期操作を利用します。 mongoose.connect.
によるデータベース クエリ

以上がNode.js で真にノンブロッキング関数を記述するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート