2012-02-29 10 views
43

私はnodejについていくつか理解していません。すべての情報源は、スレッドのロックとコンテキストの切り替えがないため、node.jsが標準のスレッド化されたWebサーバーよりもスケーラビリティが高いと言いますが、node.jsがスレッドを使用しないと、イベントI/Oモデルとはどういう意味ですか?node.jsの仕組みは?

お手数をおかけします。 ありがとう

答えて

74

ノードは完全にイベントドリブンです。基本的に、サーバーは1つのイベントを処理する1つのスレッドで構成されます。

新しいリクエストは、イベントの1つです。サーバーは処理を開始し、ブロックIO操作があると、完了するまで待機せず、代わりにコールバック関数を登録します。サーバーはすぐに別のイベント(おそらく別の要求)の処理を開始します。 IO操作が終了すると、それは別の種類のイベントであり、サーバは時間が​​経過するとすぐにコールバックを実行することによってそれを処理する(すなわち、要求に対する作業を続ける)。

したがって、サーバーは追加のスレッドを作成する必要はなく、スレッド間で切り替える必要もありません。つまり、オーバーヘッドはほとんどありません。あなたが複数のハードウェアのコアをフルに活用したい場合は、あなただけの最低レベル(C++のコードではなく、Javaスクリプト)でのNode.js

更新 の複数のインスタンスを起動し、Node.jsの中there actually are multiple threads:ありそのIOタスクを受け取ってIO割り込みを受け取り、対応するイベントをキューに入れてメインスレッドが処理するIOワーカーのプール。これにより、メインスレッドが中断するのを防ぎます。

+1

おかげでマイケル。非同期IO操作はJSの性質だと理解していますが、node.js/JSがシングルスレッドの場合、非同期操作はどのように処理されるのでしょうか。サーバ側のコードと並行して非同期のI/O操作を実行できますが、どのように動作させることができます。 – Davita

+3

@Davita:I/O操作はCPUによって実行されません。外部ハードウェアがいくつかのバッファを満たし、割り込みメカニズムを介してCPUにこれを伝えるまで、サーバーサイドコードは関与する必要はありません。 –

+5

@Davitaここにnode.jsイベントループに関する小さな記事があります:http://blog.mixu.net/2011/02/01/understanding-the-node-js-event-loop/ – LoG

0

質問はすでに長い時間の前に説明されていますが、私は同じ考えをしています。

ノードJSはシングルスレッドテクノロジです。基本的にNode JSの作成者(Ryan Dahl)は、複数のスレッドを使用した並列処理は正しい方法ではなく、あまりに複雑すぎるという懸念を抱いていました。それはあなたがそれがスレッドを使用していないと言ったときに、完全に間違った文だノードのJSの使用スレッドしかし:Node.jsのスレッドを使用しない場合は

それはどのように並列

アンスでの同時要求を処理しませんスマートな方法で。非同期I/Oを処理するためのライブラリを:それは、すべてのHTTPがLibuv

任意のブロック操作を処理するための(libuv中)スレッドプール内の&複数のスレッドを要求し提供するために、単一スレッドを使用しています。

イベントI/Oモデルとはどういう意味ですか?

Ans:適切な用語は、ノンブロッキングI/Oです。ノードJSの公式サイトによれば、ブロックすることはほとんどありません。要求がノード・サーバーに送られると、要求をキューに入れません。それは要求を受け取り、ブロックされた操作であれば実行を開始し、作業スレッド領域に送られ、コード実行が終了すると同じコールバックを登録し、同じコールバックをトリガしてイベントキューに入り、応答を作成してそれぞれのクライアントに送信します。

お役立ちリンク: click here