Node.jsは着信リクエストをどのように処理しますか?

ルイス・オルバイセタ:

Node.jsに関するより複雑な概念に飛び込むために、言語とその基礎となる基本的なビルディングブロックに関する原則を確実に理解するために、いくつかの調査を行っています。

私に関する限り、Node.jsは各着信リクエストを処理するためにreactorパターン依存しています。このアルゴリズムは、イベントデマルチプレクサアルゴリズムに基づいています。2つ目は、リクエスト操作とそのリソースの処理を担当し、操作が完了すると、「結果」をイベントキューに追加します。このプロセスの後、イベントループは各イベントのハンドラーの実行を担当します。

シングルスレッドプロセスとして、イベントループがすべてのイベントキュータスクを並行して管理している場合、イベントデマルチプレクサーがすべての着信操作をどのように処理するかを理解するのに苦労しています...

Node.jsのドキュメントでこれを見つけました

最新のカーネルのほとんどはマルチスレッドなので、バックグラウンドで実行されている複数の操作を処理できます。これらの操作の1つが完了すると、カーネルはNode.jsに通知して、適切なコールバックがポーリングキューに追加され、最終的に実行されるようにします。これについては、このトピックの後半でさらに詳しく説明します。

これは、イベントデマルチプレクサータスクがノードによって処理されず、ノードが結果を取得してイベントキューに追加することを意味しますか?それはノードがシングルスレッドではないことを意味しませんか?

各リクエストがたどるパスを明確に説明するいくつかの有用なグラフィックをWeb上で見つけましたが、スレッドがそれぞれを処理する実際のタイミングを説明するものを見つけるのは本当に難しいです。

jfriend00:

node.jsでは、Javascriptを単一のスレッドで実行します(ワーカースレッドやクラスタリングについて話していない場合)。ただし、ファイルI / Oなどのnode.js組み込みライブラリの多くの非同期操作や一部の暗号操作は、独自のスレッドを使用してタスクを実行します。したがって、fs.open()ファイルを開くなどの非同期操作を呼び出すと、ネイティブコードに移行し、内部スレッドプールからスレッドを取得し、そのスレッドがファイルを開きます。fs.open()次に、関数はJavascriptに戻ります(スレッドはバックグラウンドで続行します)。しばらくして、タスクが完了すると、内部スレッドがイベントをnodejsイベントキューに挿入し、nodejsがイベントキューをチェックするサイクルを持つと、そのイベントを見つけて、それに関連付けられているJavaScriptコールバックを実行し、非同期の結果を返します。あなたのJavascript。

そのため、スレッドが関係している場合でも、JavaScriptはすべてイベントループを通じてシングルスレッドのままです。

そのため、nodejsは一部の内部ネイティブコード操作にネイティブコードスレッドを使用します。ネットワーキングやタイマーのような他のものはスレッドなしで実装されます。

次に、Nodeのデータベースからデータをフェッチするリクエストを送信した場合、イベントデマルチプレクサーはそれをどのように処理しますか?メインスレッドはその操作を処理するためにイベントループを停止し、イベントハンドラーがキューに入れられた後に再開しますか?

「イベントデマルチプレクサ」などの用語は、node.jsに適用するものです。それらはnode.jsが使用するものではないので、あなたが何を求めているのか完全にはわかりません。

Node.jsは一度に1つのイベントを実行します。割り込み駆動型の機能はありません。したがって、そのイベントが(returnすべてを開始したコールバックからを発行することにより)イベントループに制御を戻すまで、1つのイベントを実行します。これで、元のイベントが完了していない可能性があります。非同期を実行して、別のイベントがトリガーされて完了を通知する可能性がありますが、JavaScriptの実行が終了し、制御がイベントループに戻りました。

着信Fetch要求(単なる着信HTTP要求)がサーバーに到着すると、最初にOSによってキューに入れられます。次に、イベントループがそれを見る機会がある場合、それはnode.jsイベントキューに追加され、処理が完了する前にあった他のイベントがFIFO順に処理されます。現在、nodejsイベントループは単一のイベントキューほど単純ではありません。実際には、さまざまなタイプの作業用にいくつかの異なるキューがあり、最初に実行されるものに優先順位がありますが、最も単純なレベルでは、単一のFIFOキューとして考えることから始めることができます。そして、何も中断されません。

イベントキューからイベントを引き出し、それに関連付けられたJavaScriptコールバックを実行します。そのコールバックがイベントループに戻ったら、次のイベントを取得して同じことを行います。

イベントは、ネイティブコードスレッド(ファイルI / Oまたは一部の暗号化操作で行われるような)によって、またはイベントループサイクルの一部としてイベントループに組み込まれたポーリングメカニズムを介して、特定のことをチェックすることにより、イベントキューに追加できます。実行の準備ができている(ネットワークおよびタイマーと同様)。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Node.jsサーバーはどのようにリクエストを処理しますか?

分類Dev

シングルスレッドのNode.jsはどのようにリクエストを同時に処理しますか?

分類Dev

Node.jsは1つのスレッドで同時リクエストをどのように処理しますか?

分類Dev

node.jsシングルスレッドモデルはどのように同時リクエストを処理しますか?

分類Dev

KestrelはNode.jsのようなリクエストの処理に単一のスレッドを使用していますか?

分類Dev

Node.jsを使用して誤ったPOSTリクエストを処理するにはどうすればよいですか?

分類Dev

応答を送信した後、Node / Expressで現在のリクエスト処理を終了するにはどうすればよいですか?

分類Dev

App Engine StandardのNode.JSはクラッシュをどのように処理しますか?

分類Dev

Node.jsで関数を持つオブジェクトはどのように処理されますか?

分類Dev

着信パイプストリームを処理するNode.jsモジュールを作成するにはどうすればよいですか

分類Dev

Node.jsでPOSTリクエストを処理した後、別のページにリダイレクトするにはどうすればよいですか?

分類Dev

node.jsで、httpリクエストから応答が受信されない場合、どのようにしてわかりますか?

分類Dev

Node.jsのスレッドプールを介してI / Oのブロックはどのように処理されますか?

分類Dev

Node.jsはどのようにスクリプトをメモリにロードしますか?

分類Dev

Node.jsはクライアントリクエストを1つずつ処理しますか?

分類Dev

stream.Readable.prototype.onはnode.jsソースコードのイベントをどのように処理しますか?

分類Dev

Node.js:ループ内のコールバックをどのように処理しますか?

分類Dev

Node.jsは閉じられていないHTTP応答をどのように処理しますか

分類Dev

node.jsで発信httpリクエストをプロファイリングするにはどうすればよいですか?

分類Dev

node.jsでHTTPPOSTリクエストはどのように行われますか?

分類Dev

Express node.js-JSONをリクエストし、非同期で処理します

分類Dev

Node.jsストリームはどのように機能しますか?

分類Dev

node.jsリクエストライブラリのタイムアウト時にコールバックをどのように設定しますか?

分類Dev

Twilio Node SDKをどのように使用してWebhookリクエストを検証しますか?

分類Dev

シングルスレッドはNode.jsの非同期コードをどのように処理しますか?

分類Dev

Node.jsでエクスプレスがhttpリクエストを「シリアルに」処理するのはなぜですか?

分類Dev

node.jsへの論理クエリを介してmongodbのデータを取得するにはどうすればよいですか?

分類Dev

Azure Functionsとnode.jsを使用してmodule.exportsの外部でaxiosリクエストを行うにはどうすればよいですか?

分類Dev

Node JSで単一のAPIが複数のリクエストを処理することは可能ですか?

Related 関連記事

  1. 1

    Node.jsサーバーはどのようにリクエストを処理しますか?

  2. 2

    シングルスレッドのNode.jsはどのようにリクエストを同時に処理しますか?

  3. 3

    Node.jsは1つのスレッドで同時リクエストをどのように処理しますか?

  4. 4

    node.jsシングルスレッドモデルはどのように同時リクエストを処理しますか?

  5. 5

    KestrelはNode.jsのようなリクエストの処理に単一のスレッドを使用していますか?

  6. 6

    Node.jsを使用して誤ったPOSTリクエストを処理するにはどうすればよいですか?

  7. 7

    応答を送信した後、Node / Expressで現在のリクエスト処理を終了するにはどうすればよいですか?

  8. 8

    App Engine StandardのNode.JSはクラッシュをどのように処理しますか?

  9. 9

    Node.jsで関数を持つオブジェクトはどのように処理されますか?

  10. 10

    着信パイプストリームを処理するNode.jsモジュールを作成するにはどうすればよいですか

  11. 11

    Node.jsでPOSTリクエストを処理した後、別のページにリダイレクトするにはどうすればよいですか?

  12. 12

    node.jsで、httpリクエストから応答が受信されない場合、どのようにしてわかりますか?

  13. 13

    Node.jsのスレッドプールを介してI / Oのブロックはどのように処理されますか?

  14. 14

    Node.jsはどのようにスクリプトをメモリにロードしますか?

  15. 15

    Node.jsはクライアントリクエストを1つずつ処理しますか?

  16. 16

    stream.Readable.prototype.onはnode.jsソースコードのイベントをどのように処理しますか?

  17. 17

    Node.js:ループ内のコールバックをどのように処理しますか?

  18. 18

    Node.jsは閉じられていないHTTP応答をどのように処理しますか

  19. 19

    node.jsで発信httpリクエストをプロファイリングするにはどうすればよいですか?

  20. 20

    node.jsでHTTPPOSTリクエストはどのように行われますか?

  21. 21

    Express node.js-JSONをリクエストし、非同期で処理します

  22. 22

    Node.jsストリームはどのように機能しますか?

  23. 23

    node.jsリクエストライブラリのタイムアウト時にコールバックをどのように設定しますか?

  24. 24

    Twilio Node SDKをどのように使用してWebhookリクエストを検証しますか?

  25. 25

    シングルスレッドはNode.jsの非同期コードをどのように処理しますか?

  26. 26

    Node.jsでエクスプレスがhttpリクエストを「シリアルに」処理するのはなぜですか?

  27. 27

    node.jsへの論理クエリを介してmongodbのデータを取得するにはどうすればよいですか?

  28. 28

    Azure Functionsとnode.jsを使用してmodule.exportsの外部でaxiosリクエストを行うにはどうすればよいですか?

  29. 29

    Node JSで単一のAPIが複数のリクエストを処理することは可能ですか?

ホットタグ

アーカイブ