web-dev-qa-db-ja.com

NodeJSとノンブロッキングを理解するIO

それで、私は最近、プログラミングの世界で非常に急速に広がっているNodeウイルスを注入されました。

私はその「ノンブロッキングIO」アプローチに魅了されており、実際にいくつかのプログラムを自分で試しました。

しかし、現時点では特定の概念を理解できていません。

素人の言葉で答えが必要です(Javaバックグラウンド)から来た人)

1。マルチスレッドおよびノンブロッキングIO。

実際のシナリオを考えてみましょう。たとえば、ユーザーが登録できるWebサイトがあります。以下はコードです。

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

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

ノードでは、私が理解しているように、プログラムの残りの部分が実行されている間、2行目と3行目が並行して実行され、インタープリターは2行目と3行目を「x」ミリ秒ごとにポーリングします。

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

2。スケーラビリティ

最近、LinkedInがモバイルアプリのバックエンドとしてNodeを採用し、大幅な改善が見られたことを読みました。

それがどのようにそのような違いをもたらしたかを誰かが説明できますか?

。他のプログラミング言語への適応

Nodeがパフォーマンスに関して大きな違いを生んでいると人々が主張しているのなら、なぜ他のプログラミング言語がこのノンブロッキングを採用していないのかIOパラダイム?

私は何かが欠けていると確信しています。あなたが私を説明し、いくつかのリンクで私を導くことができる場合にのみ、役に立ちます。

ありがとう。

19

同様の質問があり、おそらくあなたが探しているすべての情報が含まれています: シングルスレッドのノンブロッキングIOモデルはNode.jsでどのように機能するか

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

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

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

「コードを除いてすべてが並行して実行される」というフレーズは、それをうまくまとめていると思います。たとえば、「HTTPパラメータの読み取り」のようなものは順番に実行されますが、2行目と3行目のようなI/O関数は、イベントループに追加され、後で実行されるコールバックに関連付けられています。つまり、基本的に要点は i/Oを待つ必要はありません

2.2。
1。で説明したことにより、Nodeは、 I/O集中 要求し、多くのユーザーが同時に接続できるようにします。これはシングルスレッドであるため、CPUを集中的に使用するタスクに対して必ずしも適切に拡張できるとは限りません。

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

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

13

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

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

Q3。ほとんどすべてのプログラミング言語には、使用したい場合にノンブロッキングI/Oがすでに備わっています。 Nodeはプログラミング言語ではなく、JavaScriptを実行し、ノンブロッキングI/Oを使用するWebサーバーです(例:私は10年前にPerlでGoogleと同じように個人的に同じものを書きました) (Cで)彼らが始めたとき、そして他の多くの人々も同様のWebサーバーを持っていると確信しています)ノンブロッキングI/Oは難しい部分ではありません-プログラマーにそれを使用する方法を理解させるのは難しい部分です。Javascriptは、それらのプログラマーがすでにイベントプログラミングに精通しているため、たまたまそのためにうまく機能します。

3
cnd

Node.jsは数年前から存在していますが、そのパフォーマンスモデルはまだ少し不思議です。

私は最近ブログを始めましたが、node.jsモデルは自分自身で理解を深めたいと思っていたので、最初のトピックとして適していると判断しました。学んだことを他の人と共有することも役立ちます。これは、高レベルの概念といくつかのトレードオフを説明する、私が書いたいくつかの記事です。

ブロッキングI/Oと非ブロッキングI/O –何が起こっているのですか?

node.jsのパフォーマンスを理解する

1
Monz