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

Node.js でノンブロッキング関数を正しく実装するにはどうすればよいですか?

Patricia Arquette
リリース: 2024-12-09 10:10:09
オリジナル
338 人が閲覧しました

How Can I Correctly Implement Non-Blocking Functions in Node.js?

Node.js での非ブロッキング関数の正しい実装

誤解にもかかわらず、コードを Promise でラップするだけでは、非ブロック関数にはなりません。 -ブロッキング。 Promise executor 関数は本質的に同期的であるため、実行をブロックします。これが、後続の行を印刷する前に提供されたコードで観察される遅延の理由です。

提供されたコードの問題

コードは最初はノンブロッキングであるように見えます、Promise を利用して、計算量の多いlongRunningFunc の結果を返します。ただし、実行すると、2 行目と 3 行目が出力されるまでに遅延が観察されます。これは、プログラムが Promise の解決を待っていることを示しています。

Node.js の真のノンブロッキング コード

Node.js で真にノンブロッキング コードを作成するには、いくつかの方法があります。オプション:

  • 子プロセス: 別の子プロセスでコードを実行し、完了時に非同期通知を受け取ります。
  • ワーカー スレッド (Node. js v11 ): Node.js で導入された実験的なワーカー スレッドを活用するv11.
  • ネイティブ コード アドオン: libuv または OS レベルのスレッドを利用してカスタム ネイティブ アドオンを開発します。
  • 既存の非同期 API の活用: 既存の非同期 API をベースにして構築し、メインでの長時間のコード実行を回避します。 thread.

例の修正

コードを Promise でラップするだけでは非ブロック動作には十分ではありませんが、setTimeout() を使用してスケジュールを設定できます。後で実行するための for ループ:

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);
  });
}
ログイン後にコピー

このアプローチでは、for ループのタイミングがシフトされます。非ブロッキング動作のように見えます。ただし、for ループはスケジュールされた後も同期的に実行されることに注意することが重要です。真のノンブロッキング コードを実現するには、前に説明した手法のいずれかを採用する必要があります。

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

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