web-dev-qa-db-ja.com

NodeJSを「ノンブロッキング」にするにはどうすればよいですか?

私はNodeJSを学習していて、何かを明確にしたかっただけです。これまでのいくつかの入門チュートリアルと本では、非常に早い段階でNodeの「ノンブロッキング」アーキテクチャについて説明しました。むしろ、ノンブロッキングの方法でコーディングすることが可能(そして推奨されるのは全体)でした。

たとえば、この例は、データベースからデータを取得するための非同期の方法を読んでいる本に記載されています。

http.createServer(function (req, res) {
  database.getInformation(function (data) {
      res.writeHead(200);
      res.end(data);
  });
});

(私が理解しているように)何が起こるかは、Nodeはデータベースへの呼び出しを行い、次にコールスタック上の次の処理を続行します。データベース要求が完了すると、匿名のコールバック関数が入力され、その関数がコールスタックに追加されます(その後、Nodeがそれに到達したときに実行されます)。

私の質問は、正確には処理データベース要求ですか?確かにNodeはそれが行われている間、ブロックしますか?データベース要求を処理するのは何ですか?またはNodeが外部リソースへの非同期HTTP GET要求を待機している場合、何ができるようにその要求を処理します= Node呼び出しスタックの処理を続行し、「非ブロッキング」になるには?

14
Anonymous

Node.jsが「非ブロッキング」と記述されている場合、これは特に、そのIOが非ブロッキングであることを意味します。Node使用 libuv は、プラットフォームに依存しない方法でIOを処理します。Windowsでは、IO完了ポートを使用します、Unixでは、epoll/kqueue/select/etcを使用します。そのため、非ブロッキングIOリクエストを作成します(バックグラウンドスレッドモニタリングがある可能性がありますが、これはJavaScriptに公開されません)その結果、メイン(読​​み取り:のみ)JavaScriptスレッドでJavaScriptコールバックを呼び出すイベントループ内でキューに入れられます。

データベースの場合は、ライブラリの作成方法によって異なります。 (一部のNoSQLデータベースが行うように)HTTPを使用して通信する場合、標準ノードhttpライブラリを使用して純粋なJavaScriptで簡単に記述できます。それを別の方法で行うのであれば、それはライブラリ次第です。 C/C++で記述して、抽象化がJavaScriptに公開されない限り、バックグラウンドスレッドを使用できます。

データベース要求を「処理」していることについての質問については、理想的には、単純なメッセージをライブラリに送信するだけです(SQLステートメントやその他のクエリ、接続要求など)。その時点でJavaScriptチャッギングを続けます。ライブラリがメッセージを送信する準備ができると、コールバックを実行するノードのイベントキューにメッセージが返され、コードのスニペットを実行できます。

17
ckknight