ホームページ  >  記事  >  ウェブフロントエンド  >  Node.js の非同期性の詳細な分析

Node.js の非同期性の詳細な分析

青灯夜游
青灯夜游転載
2021-06-08 10:39:472287ブラウズ

この記事では、Node.js の非同期について詳しく説明します。一定の参考値があるので、困っている友達が参考になれば幸いです。

Node.js の非同期性の詳細な分析

Node.js 非同期については、ノンブロッキング I/OEvent の 2 点が避けられません。ループ 。この2点があるからこそ、Node.jsはオンライン環境でも高機能と言えるので、Node.jsの非同期の仕組みと使い方を学んでいきましょう! [推奨学習: 「nodejs チュートリアル 」]

Node.js のノンブロッキング I/O

    ##I/O は
  • Input/Output、システムの 入力と出力
  • ブロッキング I/O とノンブロッキング I/O の違いは、入力から出力までの期間に
  • システムが他の入力を受信できるかどうかです。
  • 食べ物の注文を例に挙げます。食堂で食べ物を注文するには列に並ぶ必要があります。このプロセス中、おばさんは一度に 1 人しか受け取ることができません。「注文 - おばさんがスプーンを振る」食べ物を積み込む - 「食べ物を持ってくる」プロセスでは、おばさんは他の人の注文を受け入れることができません。これは I/O をブロックしています。レストランに行って食べ物を注文するとき、ウェイターに欲しいものを伝えることができます。 「レストランに行くときはトマトを食べてください。スクランブルエッグ、ウェイターはそれを書いてシェフに渡しました。そのとき、別のテーブルが来てウェイターを呼び、ザリガニが食べたいと言った。つまり、ウェイター
は、あなたに提供する前に他の料理を受け入れました。人間の注文

、これはノンブロッキング I/O です。 ノンブロッキング I/O を理解するための鍵は、

Input
    /
  • Output# のシステムを決定することです。 ## 。 I/O プロセス中に他の I/O を実行できるかどうかを検討してください。
  • 食べ物の注文の例では、入力/
  • 出力
を実行するシステムが注文 - キッチン (おばさん) による処理 - 提供 このようなシステムこの例では、この 2 つがノンブロッキングかブロッキングかを判断する鍵となるのは、「プロセス中」です。注文と提供について、他の注文を受け入れて提供することはできますか? 「仏陀は壁を飛び越える」を注文すると、料理が提供されるまでに長い時間がかかる場合がありますが、来る人は簡単な料理、つまり炒め麺のようなものを注文するようなものです。たぶん、人の波が数回行ったり来たりした後、まだ食べ物を提供できていないでしょう。

Node.js はコンピュータの制御に使用されます。ファイルの読み込みなどの一部の操作には非常に時間がかかります。他の I/O が実行できない場合、処理効率は非常に低くなります。はい、これは 1 つです。 Node.js がノンブロッキング I/O である理由。 Node.js のイベント ループNode.js は、起動時に libuv が提供する イベント ループ

を初期化します。すべてに 6 つのステージが含まれています。これらの 6 つのステージは、次の図に示す順序で各イベント ループ内で繰り返し実行されます。 timers

フェーズ: このフェーズは、

timer

(setTimeout,

setInterval

) I/O

callbacks# のコールバックを実行します。 ## フェーズ: 前のサイクルからのいくつかの未実行 I/O コールバックを処理します。

Node.js の非同期性の詳細な分析

idle
  • prepare フェーズ: Node # によって内部的にのみ使用されます。 ##poll ステージ: 新しい I/O イベントを取得します。ノードは適切な条件下でここでブロックします。 check ステージ:
  • setImmediate( )
  • のコールバックを実行します。
  • close コールバック
  • ステージ: socketclose イベント コールバック
  • ##各ステージには次のものがあります。コールバックを実行するための先入れ先出し (FIFO) キュー。イベント ループが各ステージまで実行されると、コールバック関数は、キューの内容が消費されるまで、対応するコールバック キューから実行のために取り出されます。または、実行されたコールバックの数が最大
  • に達しました。
  • その後、イベントループは次のステージに入り、次のステージに対応するキューからコールバック関数が取り出して実行され、これをイベントループの最終ステージまで繰り返します。イベントループもプロセスが終了するまで順次実行されます。 イベント ループ内の 6 つのマクロ キューとマイクロ キューの関係は次のとおりです。 マイクロ キュー (microtask
  • ) は、イベント ループのさまざまなステージ間、またはイベント ループの各ステージで実行されます。対応するマクロ キュー間で実行されるイベント ループ (
  • macrotask)。 特に混乱を招くバージョン変更を次に示します:
    • Node10 以前のバージョンの場合: マクロ キュー内に複数のマクロ タスクがあり、マクロ キュー内のすべてのマクロ タスクが完了するまで、マイクロ キュー内のマイクロ タスクは実行されません。
    • Node11 以降のバージョンの場合: ステージ内の対応するマクロ キュー内のマクロ タスクが実行されると (setTimeoutsetInterval、および setImmediate 3 つ (I/O を除く)、マイクロタスク キューをすぐに実行し、マイクロキュー内のすべてのマイクロタスクを実行してから、マクロキューに戻って次のマクロタスクを実行します。この はブラウザ側の操作 と一致しています。

    Node.js 非同期プログラミング - callback

    • コールバック関数の形式の仕様
      • error-first コールバック
      • ノード スタイル コールバック
    • ##最初のパラメータは
    • error で、その後にパラメータは次のとおりです。結果。
    • // 第一个参数是错误捕获
      interview(function (err, res) {
        if (err) {
          console.log('cry')
          return;
        }
        console.log('smile')
      })
      function interview(callback) {
        setTimeout(() => {
          if (Math.random() > 0.2) {
            callback(null, 'success')
          } else {
            callback(new Error('fail'))
          }
        }, 500)
      }
    非同期プロセス制御: コールバック地獄、非同期同時実行性、その他の問題

    • npm: async.js; async.js 非同期プロセスを制御するには
    • thunk: プログラミング方法

    Node.js 非同期プログラミング – Promise

      は文字通りに理解できます。
    • Promise は約束を意味します。現在のイベント ループでは結果を取得できませんが、将来のイベント ループでは結果を取得できます。結果が表示されます
    • これはステート マシンです。状態が
    • resolved または rejected であると判断されると、状態は変わりません
        # #pending
      • : 初期状態、まだ結果が得られていない状態
      • fulfilled
      • / resolved: 成功した状態 #rejected
      • : 失敗ステータス
      チェーンコール:
    • .then
    および

    .catch

    resolved
      状態の
    • Promise は、状態の最初の .thenrejected
    • をコールバックします
    • Promise rejected ステータスの最初の .catch
    • をコールバックしますが、
    • Promise## の後に .catch が続くことはありません #、ブラウザ/ノード環境でグローバル エラーが発生します
      // promise的状态转换以及通过then获取内容
      const promise = new Promise((resolve, reject) => {
        setTimeout(function () {
          resolve(3);
          // reject(new Error(4))
        }, 500)
      })
      
      promise.then(function (result) {
        console.log(result)
      }).catch(function (err) {
        console.log(err)
      })
      
      setTimeout(() => {
        console.log(promise)
      }, 800)
      then
    catch

    を実行すると、新しい Promise が返されますPromise 最終状態は、then および catch コールバック関数 if の実行結果に基づいて決定されます。コールバック関数は最終的に throw

      Promise
    • rejected ステータス コールバック関数が最終的に return の場合、
    • Promise
    • resolved Statusしかし、コールバック関数が最終的に return
    • Promise
    • を返した場合、 Promise はコールバック関数と同じになりますreturnPromise 状態は一貫したままです Node.js 非同期プログラミング –
    • async
    /

    awaitasync function

    は、
      Promise
    • の構文上のシュガー カプセル化です。 非同期プログラミングの究極のソリューション – 同期的な方法で非同期に記述する#await
    • キーワードは
    • async 関数の実行を「一時停止」できます
      • #await キーワードは同期的に取得できますPromise
      • try-catch の実行結果は、次のように取得されたエラーを取得できますawait
      • (async function () {
          await findJob()
          console.log('trip')
        })()
        
        async function findJob() {
          try {
            // 进行三轮面试
            await interview(1);
            await interview(2);
            await interview(3);
            console.log('smile')
          } catch (e) {
            console.log('cry at ' + e.round)
          }
        }
        
        // 进行第round轮面试
        function interview(round) {
          return new Promise((resolve, reject) => {
            setTimeout(() => {
              if (Math.random() < 0.2) {
                const error = new Error(&#39;failed&#39;);
                error.round = round;
                reject(error);
              } else {
                resolve(&#39;success&#39;);
              }
            }, 500)
          })
        }
        これは、イベント ループを通じて存在する 関数
      • です。
    概要

    ノンブロッキング I/O を理解するには、主に

    I/O を実行するシステムを決定し、他のシステムがそうでないかを考えることにあります。 I/O は /O で実行できます。

    Node.jsの
      イベントループ
    • Node11以降のバージョンではブラウザのイベントループと同じように動作しますので、区別に注意してください。 Node.js の非同期プログラミングの仕様では、最初のパラメータは
    • error
    • で、結果は次のようになります。
    • Promise
    • ステート マシン であり、初期状態は
    • pending
    • ですが、状態が resolved であると判断されると、または 拒否されましたは変更されず、.then および .catch を通じてチェーン呼び出しを行うことができます。 async/await
    • 非同期
    • を同期的な方法で記述することは、非同期プログラミングに対する究極のソリューションです。 プログラミング関連の知識について詳しくは、プログラミング ビデオをご覧ください。 !

以上がNode.js の非同期性の詳細な分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はjuejin.cnで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。