PythonやRubyにもそのようなフレームワークはありますが、実際の運用では必然的に同期コードを含むライブラリが使われるため、Node.js以前はJavaScriptのサーバーサイドプログラミングはほとんど空白でした。すべての IO が非同期であるコード ベースを構築できます。
ほとんどの Web アプリケーションのボトルネックは IO、つまりディスクへの読み取りと書き込み、ネットワークへの読み取りと書き込み、データベースへの読み取りと書き込みです。この時間をどのような戦略で待つかが、パフォーマンスを向上させるための重要なポイントとなります。
PHP の戦略: 複数のプロセスを実行し、IO が完了するまで直接待機します。欠点: 複数のプロセスがメモリの複数のコピーを消費するため、プロセス間でデータを共有することが困難になります。
通常の C/C 戦略: 複数のスレッドで実行され、プログラムはそれ自体でロック状態を維持します。短所: 開発コストが高く、エラーが発生しやすく、デバッグが難しい。
Python (Tornado): 複数のリクエストが 1 つのプロセスで順番に実行され、IO が発生すると別のリクエストに切り替わります。短所: 1 つのリクエストに対する時間の使い方は依然として最も効率的ではありません。
「最も効率的な時間の使い方」とは何でしょうか?たとえば、無関係なデータベース クエリが 2 つあり、PHP では通常、1 つが最初に実行され、実行が完了した後に 2 つ目が実行されます (合計時間は明らかに b です)。同時に実行する必要があります。
マルチスレッドをサポートする Python やその他の言語の問題は、言語レベルでは、たとえ 2 つの操作があったとしても、プログラマーが仮想マシンに同時に実行するように指示することが難しいことです。というか、これはかなり面倒で、ほとんどの人は使うのが面倒です (どちらも使う価値はありません)。また、Node.js はすべての IO を非同期で強制的に実行するため、Node.js プログラマーはコードの可読性を向上させるいくつかのライブラリ (Promise、async) を使用すると、無関係な操作を簡単に並列実行できるようになります。 。
非同期 IO の実装については上で説明しましたが、非同期 IO にはどのような利点があるのでしょうか?実際、非同期 IO はサーバーへの負荷を魔法のように軽減することはできません。ただし、サーバーを追加する必要がある場合でも、非同期 IO は 1 回のリクエストの時間を短縮し、無意味な待ち時間を排除します。単一のリクエスト。したがって、単位時間あたりに処理されるリクエストの数は変わりませんが、1 件あたりのリクエストの処理時間が短縮されます。この観点から、サーバーは一部のリソース、つまりリクエストごとに接続を維持するために消費されるメモリも節約します。