2013-08-04 20 views
18

最近、プログラミングの世界で非常に高速に広がっているノードウイルスが注入されました。NodeJSとノンブロッキングIOの理解

私はそれが "Non-Blocking IO"アプローチに魅了されていて、本当に自分自身でいくつかのプログラムを試しました。

しかし、私は現時点でいくつかの概念を理解していません。

私は(Javaの背景から来る誰か)

1.マルチスレッド&ノンブロッキングIO素人用語で回答が必要です。

実際のシナリオを考えてみましょう。言う、私たちはユーザーが登録できるウェブサイトを持っている。以下はコードです。

.. 
.. 
    // Read HTTP Parameters 
    // Do some Database work 
    // Do some file work 
    // Return a confirmation message 
.. 
.. 

従来のプログラミング言語では、上記は逐次的に発生します。また、登録要求が複数ある場合、Webサーバーは新しいスレッドを作成し、残りは履歴です。もちろん、プログラマは、自分自身のスレッドを作成して、2行目と3行目を同時に処理することができます。

私が理解しているように、行2 & 3は、残りのプログラムが実行され、インタープリタが2 x3を 'x' msごとにポーリングする間に、並列に実行されます。

ここで、私の質問は、Nodeがシングルスレッド言語であれば、プログラムの残りの部分が実行されている間、2行目のジョブは何か&ですか?

2.スケーラビリティ

私は最近、LinkedInのは、自分のモバイルアプリのバックエンドとしてノードを適応していると、大規模な改善を見てきたことを読みました。

どのようにしてこのような違いが生じたのか説明できますか?他のプログラミング言語は、このノンブロッキングIOパラダイムを適応していない、なぜ人々は、それがパフォーマンスに来るときノードが違いの多くを作ることを主張している場合は、他のプログラミング言語

に適応

3 ?

私は何かが欠けていると確信しています。あなたが私を説明し、いくつかのリンクで私を案内できる場合にのみ、助けになるでしょう。

ありがとうございました。

+4

私は非常にRyahダールによって元のプレゼンテーションを見て、あなたをお勧めします(http://www.youtube .com/watch?v = ztspvPYybIY)あなたのすべての質問に答えます。 –

+0

ありがとうPradeep。それは多くの助けとなりました。 –

答えて

13

同様の質問が、おそらくあなたが探しているすべての情報が含まれていました:How the single threaded non blocking IO model works in Node.js

しかし、私は簡単にあなたの3つの部分カバーします:

1.
2行目と3行目を非常に単純な形式では、次のようになります。
            db.query(...、function(query_data){...});
            fs.readFile( '/ path/to/file'、function(file_data){{}});

関数(query_data)と関数(file_data)は、コールバックです。関数db.queryとfs.readFileは実際のI/O要求を送信しますが、コールバックを使用すると、応答が受信されるまでデータベースまたはファイルからのデータの処理を遅延させることができます。実際には "2行目と3行目をポーリングする"というわけではありません。コールバックはイベントループに追加され、それぞれのI/Oイベントのファイル記述子に関連付けられます。次に、ファイル記述子をポーリングして、I/Oを実行する準備が整っているかどうかを確認します。そうであれば、I/Oデータでコールバック関数を実行します。

「すべてがあなたのコードを除いて並行して実行されています」とは、それをうまくまとめていると思います。例えば、「Read HTTP parameters」のようなものは順番に実行されますが、2行目や3行目のような入出力関数は、イベントループに追加されて後で実行されるコールバックに関連付けられます。だから基本的には全体の点はです。それはI/Oを待つ必要はありません。そのため、物事の

2.
が1で説明し、ノードがI/O集中型要求に対してもスケールと多くのユーザーが同時に接続することができます。これはシングルスレッドなので、CPU集約型タスクでは必ずしも拡張性が高いとは限りません。

3.
JavaScriptは、これは簡単にコールバック、イベントループとクロージャをサポートしていますので、このパラダイムはJavaScriptで使用されてきました。これは他の言語では必ずしも当てはまりません。

私はちょっと離れているかもしれませんが、これは起こっていることの要点です。

+0

ありがとうございました。私は今かなりのビデオを見て、それを手に入れました。 –

+1

@Nathanielと同様に、非ブロッキングIOパラダイムではコールバックのサポートが必要です。クロージャを持つどの言語でもこのモデルを実装できます。ReactPHPは例です。 –

+1

@IssamZoli - ありがとうございます。私は今までにreactphpに気付かないように私がどのように管理するのだろうか。あなたのシングルリンクは、私のLaravelアプリでの使用のために反応してレースでかなりの旅に出ました。ありがとうメガトン! – techfoobar

3

Q1。 "プログラムの残りの部分が実行されている間、2行目のジョブは何をしますか?" 回答:「何もありません」。 2行目と3行目はそれぞれstartそれぞれのジョブですが、必要なディスクセクタがまだロードされていないため、これらのジョブをすぐに実行することはできません。オペレーティングシステムがディスクを呼び出してセクタを取得しますディスクサブシステム(後で)が割り込みを発行して準備ができていることを通知するまで、「何も起こりません」(ノードは次のタスクを実行します)ノードは制御をライン#2と#3に戻します。

Q2。シングルスレッドノンブロッキングは、着信接続ごとにリソースをほとんど必要としません(接続されたソケットに関するハウスキーピングデータのみ)。それは非常にメモリ効率的です。従来のWebサーバーは、それぞれの新しい接続を処理するまったく新しいプロセスを「フォーク」しました。つまり、必要なコードとデータ変数のすべてのビットを膨大なものにして、CPUをタイムスライスしてそのすべてを処理します。それは大量のリソースを無駄にしています。したがって、あなたの負荷が物事を待っている多くのアイドル状態の接続であれば、ノードはロードをより意味をなさないものにします。

Q3。ほとんどのプログラミング言語は、それを使用したい場合にはすでにノンブロッキングI/Oを持っています。ノードはプログラミング言語ではなく、JavaScriptを実行し、非ブロックI/Oを使用するWebサーバーです(例:個人的に10年前に私自身が同じことをperlで書いています。他の人にも同様のWebサーバーがあると確信しています)。ノンブロッキングI/Oは難しい部分ではありません。プログラマに使い方を理解させるのは難しいことです。これらのプログラマーはすでにイベントプログラミングに精通しているので、Javascriptはうまくいくでしょう。

1

ノードがあっても。jsは数年前からありましたが、パフォーマンスモデルはまだまだ不思議です。

私は最近、ブログを開始し、node.jsモデルが自分自身をよりよく理解したかったので、最初のトピックとして良いと判断し、他の人には分かったことを分かち合うのに役立ちます。ここにある高レベルの概念といくつかのトレードオフを説明し、私が書いた記事のカップル:

Blocking vs. Non-Blocking I/O – What’s going on?

Understanding node.js Performance

関連する問題