web-dev-qa-db-ja.com

イベントループ、libuv、v8エンジンの関係

私はNode.jsのアーキテクチャを通して学んでいます。以下の質問があります。

  1. イベントループはlibuvまたはv8の一部ですか?
  2. イベントキューはイベントループの一部ですか?イベントキューはlibuvまたはv8エンジンによって生成されますか、それともイベントループ自体ですか?
  3. Libuvとv8エンジンの関係は何ですか?
  4. イベントループがシングルスレッドの場合、libuvは、ファイルI/Oを処理するための複数のスレッドを作成するために登場しますか?
  5. ブラウザにはイベントループメカニズムがありますか、それともNode.jsだけにありますか?
16
Prem
  1. イベントループは、何よりもまず、JavaScriptプログラミングモデルの基本的な部分である高レベルの概念です。実際には、すべてのV8エンベッダーはイベントループを実装する必要があります。 V8はデフォルトの実装を提供し、エンベッダーはこれを置き換えたり拡張したりできます。

  2. 質問がわかりません。 (答えは「はい」だと思いますが、「イベントループ」と「イベントキュー」の違いは何ですか?)

  3. 無し。 (Node.jsが両方を使用することを除いて。)

  4. はい、イベントループはシングルスレッドです。

  5. はい、ブラウザにもイベントループがあります(質問1を参照)。

12
jmrk

これは実際には、回答として選択された投稿で与えられているほど単純ではありません。私の発言がもう少し正確になることを願っています。うまくいけば、Nodeイベントループに関する彼の講演で、Sam Roberts(IBM)を正しく理解しました。

自分でトークを見るには、ここに行くことができます: https://www.youtube.com/watch?v=P9csgxBgaZ8

これは@jmrkによって与えられた答えへのアドオンです

Libuvは、基盤となるオペレーティングシステムにタスクを委任します。その後、オペレーティングシステムは、リッスンしているイベントが発生したときに通知を送信する責任を負います。これは、Nodeで実行する多くの操作に対して行われます。例:ソケット(net/dgram/http/tls/https/child_processパイプ、stdin、out、err)、タイムアウト、間隔。

ただし、このようにすべてを基盤となるOSに遅らせることはできません。スレッドを作成する必要がある場合があります(デフォルトでは4つのトレッドがありますが、UV_THREADPOOL_SIZEを使用してこれを変更できます)。ポーリングできないのは、ファイルシステム操作、dns.lookup()、および一部の暗号化関数です。

1
Ruud Verhoef

これらのポイントを通過します:-

  1. V8エンジンは、列車のコーチ用のエンジンです。非同期タスクを実行するためのイベントループの提供など、特定の責任があります。

  2. イベントループは、非同期タスクを実行するためのコアです。 C++ Web APIが関数(タスク)を終了するとすぐに、コールバックが呼び出されます。コールバックはイベントキューに移動され、スタックが空になるまで待機します。したがって、イベントキューはイベントループの一部であり、イベントループによって生成されます。

  3. V8エンジンは、私たちが作成したjavascriptコードを実行するために使用され、libuvは、長時間実行されるプロセスを実行するためにNodejsでマルチスレッド機能を提供するために使用されるライブラリです。

  4. イベントループはシングルスレッドですが、Nodejsはランタイムにマルチスレッドを担当するlibuvスレッドプールがあるため、シングルスレッドではありません。

  5. ブラウザAPIは、イベントループも提供します。

0
Pavneet Kaur