ホームページ >ウェブフロントエンド >フロントエンドQ&A >Node.jsとは何ですか?該当するシナリオは何ですか?
#この記事の動作環境: Windows7 システム、nodejs10.16.2 バージョン、Dell G3 コンピューター。node.js は、Chrome JavaScript ランタイムに基づいて構築されたプラットフォームです。適用可能なシナリオには、ローカライズされたオンライン音楽アプリケーション、ローカライズされたオンライン検索アプリケーション、ローカライズされたオンライン APP などが含まれます。
node.js とは?
簡単に言えば、Node.js はサーバー側で実行される JavaScript です。 Node.js は、Chrome JavaScript ランタイム上に構築されたプラットフォームです。 Node.js は、Google の V8 エンジンをベースにしたイベント駆動型 I/O サーバーサイド JavaScript 環境であり、V8 エンジンは JavaScript を非常に高速に実行し、非常に優れたパフォーマンスを発揮します。NodeJS の適用可能なシナリオを原理的に理解する
NodeJS はバックエンドのパフォーマンスが高いため、近年人気のサーバーサイド JS プラットフォームです。一方、nodeJS プラットフォーム上の npm、grunt、express などの強力なコードおよびプロジェクト管理アプリケーションの台頭により、同時実行の優れたパフォーマンスがフロントエンドの作業方法とプロセスをほぼ再定義しました。 NodeJS の成功はその威力を示していますが、すべての状況が NodeJS をサーバーサイド プラットフォームとして使用するのに適しているわけではありません。 答えはもちろんノーで、インターネット上にはさまざまな意見があります。それではNodeJSの応用を原理から理解していきましょう。
NodeJS について話す前に、まず従来の(Apache に代表される) サーバー側処理プラットフォームの仕組みを見てみましょう。並行性を処理します。
1. Apache のマルチスレッド高同時実行モード
Apache は現在、世界でナンバー 1 の Web サーバー ソフトウェアです。マルチスレッドの同時実行性は、大多数のサーバー テクノロジ セレクターによって歓迎されています。しかしその後、Apache はいくつかの大規模な WEB アプリケーションにおけるブロッキングという欠点を徐々に明らかにしました。 学生の中には、Apache は同時処理用にマルチスレッド化されているのではないかと疑問に思う人もいるかもしれません。なぜ依然としてブロックが発生するのでしょうか? これを理解するには、まずスレッドの概念を理解する必要があります。1.1 スレッドとは何ですか?
公式の説明を引用します: スレッドが独立して実行できる最小の CPU ユニットは、同じプロセス内で同時に実行できますそして、プロセスの下でメモリ アドレス空間を共有します(この機能に注意してください)。
同じプロセス内のスレッドが同じファイルとメモリ (メモリ アドレス空間) を共有することがわかります。そのため、異なるスレッドが同じ変数を占有する必要がある場合、それらのスレッドは次の条件に基づいて決定されると想像できます。先着順: 先着順の原則に基づき、最初に到着したスレッドが実行中の場合、後続のスレッドは待機することしかできません。つまり、ブロッキング キュー シーケンスに加わります。これがスレッドをブロックする原因です。 したがって、プロセスは複数のスレッドをサポートできますが、それらは同時に実行されているように見えますが、互いに同期していません。プロセス内の複数のスレッドは同じメモリ アドレス空間を共有します。つまり、同じ変数とオブジェクトにアクセスでき、同じヒープからオブジェクトを割り当てます。これによりスレッド間で情報を共有しやすくなりますが、プログラマは同じプロセス内の他のスレッドに干渉しないように注意する必要があります。
マルチスレッド並列処理の欠点を理解すると、NodeJS の能力をよりよく理解できるようになります。 NodeJS は非同期でシングルスレッドであるためです。2. NodeJS の非同期 I/O 原則
まず、Apache がデータベースをリクエストするためのコードを見てみましょう:コードが最初の行まで実行されると、スレッドはブロックされ、クエリが結果を返すのを待ってから処理を続行します。データベース クエリ、ディスクの読み取りと書き込み、ネットワーク通信 (いわゆる I/O) などの理由により、ブロック時間は (合計 CPU 周波数と比較して) 非常に長くなります。同時実行性の高いアクセスでは、スレッドがブロックされて長時間待機する一方で、新しいリクエストに対処するために新しいスレッドが常に追加されるため、多くのシステム リソースが浪費されます。 、スレッドの増加により、メモリ コンテキストを処理するために多くの CPU 時間も消費されます。 node.js がそれをどのように処理するかを見てみましょう。 ほら、
は非同期コールバック という 4 つの単語です。 query の 2 番目のパラメータはコールバック関数であり、プロセスは db.query を実行すると、結果が返されるのを待たずに、イベント ループに入るまで直接次のステートメントを実行し続けます。データベースの実行結果が返されると、イベントはイベント キューに送信され、スレッドがイベント ループに入った後にのみ前のコールバック関数が呼び出されます。より専門的な用語は、非同期 I/O です。スレッドは 1 つだけで大丈夫です。
では、なぜ NodeJS はシングルスレッドでありながら非同期実装を実現できるのでしょうか?ここで、前の図に移動し、図内のイベント キューをクリックします。
NodeJS の動作原理は実際には イベント ループ であることがわかりましたか。 NodeJS ロジックのすべてがコールバック関数に記述されており、コールバック関数は戻った後に非同期で実行されると言えます。
これを見ると、NodeJS のすべての処理が非同期であれば成功するのではないかと思わずにはいられません。違う、違う、違う!もちろんそうではありません。忘れないでください。NodeJS がこれらを実装するための基礎は シングル スレッド です。そうです、シングルスレッドです。 1 つのスレッドがすべての操作を処理します。
NodeJS が寒風の中で同時に 100,000 人の軍隊に直面していることを想像してみてください。OK、問題ありません。敵の 1 人がやって来て街に投げ込まれ、もう 1 人がやって来て街に投げ込まれます。市。街の人々は全員兵士なので、これらの敵を非常にうまく消化できます。しかし、張飛や趙雲のようなキャラクターが登場すると、古いノードは惨めな気分になるため、彼は張飛と300ラウンド戦い、彼を不自由にし、その後彼を街に投げ込みます。そうなると、後方の10万人の軍隊は、この300発の砲撃を待たなければならないことになる。 。 。
それでは、これは何を意味するのでしょうか? NodeJSはブロックしないということですが、その後のコールバック処理でブロックが発生するのではなく、NodeJS自身によるロジックの計算や処理でブロックが発生します。 NodeJS には非常に強力な分散機能があり、非同期コールバックのイベントをループできることはすでにわかっています。しかし、イベントをループするときに複雑な論理操作が発生した場合、シン シングル スレッドで数百万の論理 同時実行をどのようにサポートできるのでしょうか? I/O やネットワーク通信などの NodeJS の時間のかかる操作はすべて、実行とコールバックのためにワーカー スレッドに引き渡されるため、非常に高速です。ただし、CPU の通常の動作では、CPU 自体が抵抗することしかできません。
そう言えば、NodeJS の機能についてはおおよそ理解できたのではないでしょうか。ということで、該当シナリオは基本的に準備完了です~!
3. NodeJS の応用シナリオ
NodeJS は同時実行処理には強いですが、計算やロジック処理には弱いため、複雑な論理演算を入れるとフロントエンド (クライアント) に移動して完了し、NodeJS は非同期 I/O を提供するだけで済むため、高い同時実行性と高性能の処理を実現できます。 RESTFUL API、リアルタイム チャット、強力なクライアント ロジックを備えたシングルページ APP など、さまざまな状況が考えられます。具体例としては、ローカライズされたオンライン音楽アプリケーション、ローカライズされたオンライン検索アプリケーション、ローカライズされたオンライン APP などが挙げられます。
ところで、Apache はかなり抑制されているので、甘いデートをしてください。 Apache には、マルチスレッドで同時実行性の高い共有メモリ アドレス空間という特性があります。つまり、サーバーが十分に強力で、プロセッサに十分なコア数がある場合、Apache は非常にうまく動作するため、比較的高速な (同時) 非同期処理に適しています。大量の計算と複雑なバックエンド ビジネス ロジックを必要とするアプリケーション。
推奨学習: 「node.js ビデオ チュートリアル 」
以上がNode.jsとは何ですか?該当するシナリオは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。