web-dev-qa-db-ja.com

「ノンブロッキング」node.jsの特別な点は何ですか?

短い章 Node by McLaughlin とは、彼はこう書いています:

「ノードにはブロックがなく、同じリソースをめぐって競合するスレッドはありません(ノードは、発生した場合でも発生させることができます)。要求に応じて起動する必要はありません。Node待機しているだけです(文字通りかなり、未使用Nodeレスポンダはスリープしています。)リクエストが届くと処理されます。これにより、超プログラマがサーバー側の動作を記述しなくても、非常に高速なコードが得られます。

私は彼がPHPここで選択していると思うが-私が理解していることからPHPからPHPページが読み込まれるたびに、データベース、ファイルなどへの新しい参照を呼び出します-これは他のWebテクノロジーと本当に異なりますか?たとえば、Django/Flaskまたは単純な Python threaded-server 組み込みメソッドを使用する-それは実際にNodeのブロックなしの利点と何が違うのですか?プログラムを実行してソケットをバインドし、必要に応じてのみ関数を実行します(Javaもこれを行いますか?)

7
NoBugs

すぐにチューリング完全性の免責事項を取り除き、どの言語でも他の言語のランタイム機能に近似できるとしましょう。良い?良い。

Node.jsアプローチとPython threaded-server(または一般的なJava HTTPサーバー実装)の主な違いは、Node.jsがシングルスレッドであることです。後者の2つはマルチスレッドですが、より具体的には、後者の2つは通常、リクエストごとに1つのスレッドを専用にします。そのリクエストの処理で、ハードドライブからの読み取りやリモートデータベースへの接続などの遅い処理を行う必要がある場合、スレッドは遅い処理が完了し、残りのビジネスロジックを続行する準備ができるまでスリープします。対照的に、Node.jsのアプローチは、遅い処理が完了したときに呼び出されるコールバックをスケジュールすることです。Node.jsの単一スレッドは文字通り処理する要求がない場合を除いて、決してスリープしません。

Node.jsとPHPの主な違いは、Node.jsでは、Node.jsサーバーが実行されている限り存在する永続的なコンテキストでコードが実行されることです。たとえば、あるリクエストでグローバル変数に値を書き込んだ後、別のリクエストでグローバル変数の値を読み取ると、読み取りでは、書き込みによって書き込まれた値が表示されます。対照的に、PHPでは、新しいコンテキストが作成されますリクエストごとに、1つのリクエスト内のグローバルへの書き込みは、リクエストを処理するスクリプトが終了すると失われます。

10
Nebu Pookins

あなたが言及した他のすべてのサーバーとは異なり、Nodeはシングルスレッドですが非同期です-ここで言及したように、操作の実行を待つ代わりにコールバックをスケジュールし、操作が完了したときにコールバックを実行します、ただし、他の多くの操作が同じスレッドで間に処理された可能性があります。

警告:

これは、複数のスレッドで使用されている変数を監視する必要がない非同期プログラミングの不思議の国ですが、Nodeの動作に慣れていない場合は、通常の同期アプローチを適用することになります- これは非常に非常に遅いアプリケーションに変わる可能性があります最初のリクエストがアクションを完了するまで、すべてのリクエストが待機するために山積みになるため...

1
Alexus

A Nodeプログラムはその中心にある通常のプログラムです。そうするように特別にコードを記述しない限り、それはWebサーバーでもありません(組み込みのHTTPを使用すればかなり簡単ですが)ライブラリ)。プログラムはHTTPリクエストを取得し、コードはプログラムで利用可能なすべてのリソースを使用して、好きな方法で応答できます。

JavaScriptが昔ながらの線形実行であった場合、扱いにくい複雑なコードがなければ、一度に1つの要求しか処理できません。これは、Webリクエストの処理にかかる時間のほとんどが通常I/Oの待機に費やされることを考えるとかなり悪いです。

ただし、JavaScriptプログラムフローはイベントに基づいており、イベントが発生したときに実行されるコードとしてハンドラーを設定し、そのイベントの処理が完了すると、JavaScriptは自動的にイベントキューの次のイベントに進みます。たとえば、データベースが応答するのを待つだけでなく、リクエストを処理するためにデータベースからのデータが必要な場合は、データベースが応答したときに起動するイベントハンドラを設定します(多くの場合、コールバック関数の形式で) )、それが発生したときにジョブを完了します。その間に、他の多くのイベントが処理される可能性があります。

これが非ブロッキングの意味です。何かを待つ必要があるため、プログラム全体を停止することはありません。

優れた点は、コードをほぼ直線的に記述できることです。通常、実際の実行順序にそれほど注意を払う必要はありません。

0
aaaaaaaaaaaa