Node.jsに関するより複雑な概念に飛び込むために、言語とその基礎となる基本的なビルディングブロックに関する原則を確実に理解するために、いくつかの調査を行っています。
私に関する限り、Node.jsは各着信リクエストを処理するためにreactorパターンに依存しています。このアルゴリズムは、イベントデマルチプレクサアルゴリズムに基づいています。2つ目は、リクエスト操作とそのリソースの処理を担当し、操作が完了すると、「結果」をイベントキューに追加します。このプロセスの後、イベントループは各イベントのハンドラーの実行を担当します。
シングルスレッドプロセスとして、イベントループがすべてのイベントキュータスクを並行して管理している場合、イベントデマルチプレクサーがすべての着信操作をどのように処理するかを理解するのに苦労しています...
Node.jsのドキュメントでこれを見つけました:
最新のカーネルのほとんどはマルチスレッドなので、バックグラウンドで実行されている複数の操作を処理できます。これらの操作の1つが完了すると、カーネルはNode.jsに通知して、適切なコールバックがポーリングキューに追加され、最終的に実行されるようにします。これについては、このトピックの後半でさらに詳しく説明します。
これは、イベントデマルチプレクサータスクがノードによって処理されず、ノードが結果を取得してイベントキューに追加することを意味しますか?それはノードがシングルスレッドではないことを意味しませんか?
各リクエストがたどるパスを明確に説明するいくつかの有用なグラフィックをWeb上で見つけましたが、スレッドがそれぞれを処理する実際のタイミングを説明するものを見つけるのは本当に難しいです。
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]
コメントを追加