283

PHP (または Java/ASP.NET/Ruby) ベースの Web サーバーでは、すべてのクライアント要求が新しいスレッドでインスタンス化されます。しかし、Node.js では、すべてのクライアントが同じスレッドで実行されます (同じ変数を共有することもできます!)。I/O 操作はイベントベースであるため、メイン スレッド ループをブロックしないことを理解しています。

私が理解できないのは、ノードの作成者がノードをシングルスレッドにすることを選択した理由です。それは物事を難しくします。たとえば、メイン スレッドがブロックされる (そして新しいクライアント リクエストがブロックされる) ため、CPU を集中的に使用する関数を実行できないため、プロセスを生成する必要があります (つまり、別の JavaScript ファイルを作成し、別のノード プロセスを実行する必要があります)。それ)。ただし、前述のように、各クライアントは異なるスレッド上にあるため、PHP の CPU 集中型タスクは他のクライアントをブロックしません。マルチスレッド Web サーバーと比較して、その利点は何ですか?

注: これを回避するためにクラスタリングを使用しましたが、きれいではありません。

4

3 に答える 3

326

Node.js は、非同期処理の実験として明示的に作成されました。単一のスレッドで非同期処理を行うと、典型的な Web 負荷の下で、典型的なスレッドベースの実装よりもパフォーマンスとスケーラビリティが向上するという理論でした。

そして、あなたは何を知っていますか?私の意見では、その理論は裏付けられています。CPU を集中的に使用しない node.js アプリは、Apache、IIS、またはその他のスレッドベースのサーバーよりも数千の同時接続を実行できます。

シングルスレッドの非同期の性質により、物事は複雑になります。しかし、正直なところ、スレッド化よりも複雑だと思いますか? 1 つの競合状態が 1 か月全体を台無しにする可能性があります。または、どこかの設定のためにスレッドプールを空にして、応答時間がクロールまで遅くなるのを見てください! デッドロック、優先順位の逆転、およびマルチスレッドに伴うその他すべての回転は言うまでもありません。

結局のところ、それが普遍的に優れているとか劣っているとは思いません。それは異なり、良い場合もあればそうでない場合もあります。仕事に適したツールを使用してください。

于 2013-07-31T00:36:13.863 に答える
70

サーバーの「要求ごとに 1 つのスレッド」モデルの問題は、イベント ループ スレッド モデルと比較して、いくつかのシナリオで十分に拡張できないことです。

通常、I/O が集中するシナリオでは、要求はほとんどの時間を I/O の完了の待機に費やします。この間、「リクエストごとに 1 つのスレッド」モデルでは、スレッドにリンクされたリソース (メモリなど) は使用されず、メモリが制限要因になります。イベント ループ モデルでは、ループ スレッドは処理する次のイベント (I/O 終了) を選択します。したがって、スレッドは常にビジーです (もちろん、正しくプログラムした場合)。

イベント ループ モデルは、すべての新しいものがピカピカに見え、すべての問題の解決策ですが、どのモデルを使用するかは、取り組む必要のあるシナリオによって異なります。集中的な I/O シナリオ (プロキシなど) がある場合は、イベント ベース モデルが優先されますが、同時プロセス数が少ない CPU 集中型のシナリオでは、スレッド ベースのモデルが最適に機能します。

現実の世界では、ほとんどのシナリオはその中間にあります。スケーラビリティの真の必要性と開発の複雑さとのバランスを取り、適切なアーキテクチャを見つける必要があります (たとえば、CPU を集中的に使用するタスクをバックエンドに委譲するイベント ベース フロントエンドを用意します。フロントエンドは、タスクを待機するリソースをほとんど使用しません)。他の分散システムと同様に、それを機能させるにはいくらかの努力が必要です。

なんの努力もせずにあらゆるシナリオに対応できる特効薬を探していると、足元に弾丸ができてしまいます。

于 2013-07-31T08:27:47.007 に答える
30

簡単に言うと、ノードは内部的にシングルスレッドである V8 から描画されます。CPU を集中的に使用するタスクの制約を回避する方法があります。

ある時点 (0.7) で、著者は計算の複数のスレッドを実装する方法として分離を導入しようとしましたが、最終的に削除されました: https://groups.google.com/forum/#!msg/nodejs/zLzuo292hX0/F7gqfUiKi2sJ

于 2013-07-31T00:45:07.113 に答える