私は2か月間node.jsを学び、使用しています。 Expressを使用してMongooseと組み合わせてWebアプリケーションとRestful Web APIのセットを作成しました。 node.js:node.jsの公式Webサイトのホームページでのnode.jsの導入を振り返って、イベント駆動型の非ブロッキングI/Oモデルを使用して、それを軽量で効率的にします。では、非ブロッキングI/Oモデルとはどういう意味ですか?
非ブロッキングIOモデル
まず第一に、IO操作は間違いなく時間がかかります。サーバーが多数のリクエストを受信すると、各リクエストのプロセスまたはスレッドを作成すると、メモリオーバーヘッドが追加され、より多くの時間とリソースが無駄になる場合があります。
node.jsはイベント駆動型であるため、イベントループを使用して、IO操作によって引き起こされるボトルネックの問題を解決します。 node.jsでは、IO操作には通常、コールバック関数があります。 IO操作が完了して返されると、コールバック関数が呼び出され、メインスレッドは次のコードの実行を続けます。この問題を簡単に説明しましょう。
request( 'http://www.google.com'、function(error、response、body){console.log(body);}); console.log( 'done!');このコードは、「http://www.google.com」にリクエストを発行することを意味し、リクエストがこのコールバック関数を返すと、応答情報は出力されます。 node.jsの実行中のメカニズムにより、このコードが実行された後、すぐに出力「完了!」コンソールで、しばらくしてから応答情報を出力します。
イベントループイベントループ
次に、イベントループのメカニズムについて説明しましょう。まず、電話について話しましょう。たとえば、次のコードがあります。
関数a(arg、func){var a = arg; func(); console.log( 'a'); } function b(){console.log( 'b');} a(0、b);コードが実行された後、関数Aが最初に呼び出しに押し込まれ、スタックの最上位要素になり、Aが実行を開始します。実行プロセス中に、関数Bが通話に押し込まれ、スタックの最上位要素になります。 Bが実行された後、Bがポップアップして呼び出され、Aは再びスタックの最上位要素になります。 Aが実行された後、Aがポップアップして呼び出され、コールはアイドル状態です。
JavaScriptランタイムにはメッセージキューがあり、メッセージはコールバック関数に関連付けられています。イベントがトリガーされると、イベントに対応するコールバック関数がある場合、メッセージがメッセージキューに追加されます。
イベントループとは何かについて話しましょう。コードが実行を開始した後、関数は常に呼び出しに押し込まれます。上記の例を見てください。リクエストがコールに押し込まれ、この関数はHTTP要求(このHTTP要求がnode.jsの基礎となるモジュールに引き渡されます)になり、同時に完了したイベントはコールバック関数に関連付けられます。リクエストがポップアップされて呼び出され、Console.logがコールに押し込まれ、実行を開始します。リクエストが完了すると、完了イベントがトリガーされ、メッセージがメッセージキューにメッセージが追加されます。メッセージキューは、最初に呼び出しがアイドル状態かどうかを確認します。通話がアイドル状態でない場合、コールがアイドル状態になり、メッセージキューの頭がポップアップするまで待ちます。この時点で、メッセージに関連付けられたコールバック関数が実行されます。
まとめ
上記は、非ブロッキングモデルとイベントループの概念的な要約です。このイベントループのメカニズムは、node.jsに固有のものではなく、node.jsのコードは単一のスレッドで実行されます。多数の同時リクエストに直面するときの利点は何ですか?
上の写真は、node.jsのアーキテクチャ図を示しています。 node.jsの基礎となる層にモジュールがあり、スレッドプールの維持を担当しています。 IO要求が発行されると、node.jsの基礎となるレイヤーがリクエストを処理するための新しいスレッドを作成し、完了後に結果を上層に戻します。次に、複数のリクエストがある場合、node.jsの基礎となるモジュールは、ほとんどのタスクを完了するためにできるだけ少ないスレッドを使用します。無料のスレッドがある場合、他のことを行うために引き続き使用されます。これは間違いなく、前述のように各要求の新しいプロセスまたはスレッドの開設により、はるかに賢く、より効率的です。
この記事は、学習node.jsの要約です。問題や欠点がある場合は、批判と修正を歓迎します。