[解決済み】Node.jsはなぜシングルスレッドなのですか?[クローズド]
質問
PHP(またはJava/ASP.NET/Ruby)ベースのウェブサーバーでは、すべてのクライアントリクエストは新しいスレッドでインスタンス化されます。しかし、Node.jsでは、すべてのクライアントは同じスレッド上で実行されます(同じ変数を共有することさえできます!)I/O操作はイベントベースなので、メインスレッドのループをブロックしないことは理解しています。
私が理解できないのは、Nodeの作者がなぜシングルスレッドにしたのか、ということです。それは、物事を難しくしています。例えば、CPUに負荷のかかる関数はメインスレッドをブロックしてしまうので実行できません(新しいクライアントからのリクエストもブロックされます)ので、プロセスを生成する必要があります(つまり、別のJavaScriptファイルを作成し、その上で別のnodeプロセスを実行する必要があります)。しかし、PHPではCPU集約的なタスクが他のクライアントをブロックすることはありません。マルチスレッドのウェブサーバーと比較して、その利点は何ですか?
注:クラスタリングを使って回避したこともありますが、きれいなものではありません。
どのように解決するのか?
Node.jsは、明らかに非同期処理の実験として作成されました。その理論は、シングルスレッドで非同期処理を行うことで、一般的なスレッドベースの実装よりも、一般的なWeb負荷に対してより高いパフォーマンスとスケーラビリティを提供できる、というものでした。
そして、何を知っていますか?私の考えでは、その理論は実証されました。CPUに負荷をかけないnode.jsアプリは、ApacheやIISなどのスレッドベースサーバーよりも何千もの同時接続を実行することができます。
シングルスレッドで非同期という性質が、物事を複雑にしているのです。しかし、正直なところ、スレッディングよりも複雑だと思いますか?1つのレースコンディションが、あなたの月全体を台無しにしてしまうのです。あるいは、どこかの設定によってスレッドプールが空になってしまい、応答時間が這うように遅くなるのを見ることになります デッドロックや優先順位の逆転はもちろん、マルチスレッドに付随する他のすべての混乱も同様です。
結局、普遍的に良いとか悪いとかではなく、それぞれ違っていて、良いときもあれば悪いときもあるということだと思います。仕事には適切なツールを使いましょう。
関連
-
[解決済み] Node.jsのプログラムにコマンドライン引数を渡すにはどうしたらいいですか?
-
[解決済み] Node.jsを使うタイミングをどう判断するか?
-
[解決済み] Node.jsで終了する方法
-
[解決済み] Node.jsでファイルを書き込む
-
[解決済み] Node.jsアプリケーションをデバッグするにはどうすればよいですか?
-
[解決済み] Node.jsのmodule.exportsの目的と使い方を教えてください。
-
[解決済み] Node.jsで環境変数を読み込む
-
[解決済み] Node.jsでファイル/ディレクトリが存在するかどうかを同期的にチェックする
-
[解決済み] Node.jsのnpmモジュールをアンインストールするにはどうすればよいですか?
-
[解決済み】Node.jsとCPUに負荷のかかるリクエスト
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Node Version Manager のインストール - nvm コマンドが見つかりません。
-
[解決済み】npm 5で作成されたpackage-lock.jsonファイルはコミットするのでしょうか?
-
[解決済み] MongoDB でコレクションを日付順に並べるには?
-
[解決済み] AWS lambda function error - Unable to import module 'index': エラー
-
[解決済み] Node.jsで「btoaが定義されていない」エラーが発生する
-
[解決済み] のエラーが発生しました。これはおそらくnpmの問題ではありません。上に追加のログ出力があると思われます
-
[解決済み] エラー: ノード出力を "|head" にパイプするときに EPIPE を書き込む。
-
[解決済み】Node.jsとCPUに負荷のかかるリクエスト
-
[解決済み] マルチスレッドに代わるNode JSを把握する
-
[解決済み] Node.jsやJavascriptで非同期関数呼び出しを同期関数にラップする方法とは?