[解決済み】Node.jsは内部でThreadsに依存しているのに、どうして本質的に高速なのですか?
質問
以下の動画を見ました。 Node.jsの紹介 で、どうやってスピードの恩恵を受けるのか、まだ理解できていません。
主に、あるところでRyan Dahl(Node.jsの作者)が、Node.jsはスレッドベースではなくイベントループベースであると言っています。 スレッドは高価なので、活用するのは並行プログラミングの専門家に任せるべきだということです。
その後、Node.js のアーキテクチャスタックを示し、内部で独自のスレッドプールを持つ C の実装を基礎としていることを説明しました。 だから、明らかにNode.jsの開発者は、自分自身のスレッドをキックオフしたり、スレッドプールを直接使用したりはしない。 それだけは理解しています。
Node.jsはまだスレッドを使っているという点が理解できません。実装を隠しているだけで、50人が50個のファイル(現在メモリ上にない)をリクエストしたら、50個のスレッドが必要ではないのでしょうか?
唯一の違いは、内部で管理されているので、Node.js開発者はスレッド化された詳細をコーディングする必要がないことですが、その下ではまだIO(ブロック化)ファイル要求を処理するためにスレッドを使用しています。
つまり、1つの問題(スレッド)を取り上げて、その問題がまだ存在している間はそれを隠しているだけではないのでしょうか。
私がまだ理解していない詳細があるに違いない。
どのように解決するのですか?
実は、ここではいくつかの異なる事柄が混同されているのです。 しかし、これは「スレッドは本当に難しい」というミームから始まっています。 もしスレッドが難しいなら、スレッドを使うときに、1)バグで壊れたり、2)可能な限り効率的に使わなかったりする可能性が高くなるわけです。 (2)は、あなたが質問しているものです。
彼が挙げた例の一つを考えてみてください。リクエストが来て、何らかのクエリを実行し、その結果を使って何かをするというものです。 これを標準的な手続きで書くと、次のようなコードになります。
result = query( "select smurfs from some_mushroom" );
// twiddle fingers
go_do_something_with_result( result );
もしリクエストが来たことによって、上記のコードを実行する新しいスレッドを作成した場合、スレッドがそこに座っていて、何もしていない間に
query()
が実行されています。 (Ryanによれば、Apacheはオリジナルのリクエストを満たすためにシングルスレッドを使っているのに対し、nginxはそうではないため、彼の言うようなケースで凌駕しています)。
さて、もしあなたが本当に賢いのであれば、上記のコードを、クエリを実行している間に環境が消えて他のことができるような方法で表現することでしょう。
query( statement: "select smurfs from some_mushroom", callback: go_do_something_with_result() );
これは基本的にnode.jsがやっていることです。 基本的には、言語と環境の都合で、クロージャについて指摘したように、あなたのコードを装飾しているのです。 そういう意味では、node.jsは 新しい 非同期I/Oを発明したという意味では(誰もそんなことを主張しているわけではありませんが)、表現方法が少し違うという点では新しいと思います。
注:私が「環境はいつ何を実行するかについて賢い」と言ったとき、具体的には、あるI/Oを開始するのに使ったスレッドを、他のリクエストや、並行して行える計算を処理したり、他の並列I/Oを開始するのに使うことができる、という意味である。 (同じリクエストに対してより多くの作業を開始できるほどnodeが洗練されているかは定かではありませんが、イメージはつかめると思います)。
関連
-
[解決済み】Uncaught ReferenceError。Firebase は定義されていません。
-
[解決済み] Node.jsのプログラムにコマンドライン引数を渡すにはどうしたらいいですか?
-
[解決済み] JSONPとは何か、なぜ作られたのか?
-
[解決済み] Node.jsを使うタイミングをどう判断するか?
-
[解決済み] Node.jsで終了する方法
-
[解決済み] Node.jsアプリケーションをデバッグするにはどうすればよいですか?
-
[解決済み] Node.jsを完全にアンインストールして、最初から再インストールする方法 (Mac OS X)
-
[解決済み] Node.jsのmodule.exportsの目的と使い方を教えてください。
-
[解決済み] ConcurrentHashMapに対するConcurrentHashSetが存在しない理由
-
[解決済み] 一般的に、Node.jsは10,000の同時リクエストをどのように処理するのですか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】フォームコントロールの値アクセサがない
-
[解決済み】JavaScriptで':'(コロン)は何をするのか?
-
[解決済み】Uncaught ReferenceError: angular is not defined - AngularJSが動作しない。
-
[解決済み】webpack-dev-serverにリモート接続すると、「Invalid Host header」というメッセージが表示されます。
-
[解決済み】NodeJS "ESモジュールをロードするためにインポートを使用する必要があります。"
-
[解決済み] [Solved] Uncaught TypeError: nullのプロパティ 'appendChild' を読み取ることができない。
-
[解決済み] ローカルファイルを開くことができません - Chrome: ローカルリソースのロードが許可されていません
-
[解決済み】 \u003C とは何ですか?
-
[解決済み】JavaScriptで関数が存在するかどうかを確認する方法は?
-
[解決済み] 一般的に、Node.jsは10,000の同時リクエストをどのように処理するのですか?