JavaScript イベント ループのケース スタディ

JavaScript イベント ループのケース スタディ

js のイベント ループ

JavaScript はシングルスレッドなので、同じイベントで実行できるメソッドは 1 つだけなので、プログラム内のメソッドは実行スタックに追加され、後入れ先出しの順序で実行されます。非同期タスクに遭遇した場合、ブロックされることはありませんが、タスクはイベント キューに配置され、実行スタック内の同期コードは実行され続けます。現在の実行スタック内のすべてのタスクが実行されると、イベント キュー内のタスクが検索され、タスクのコールバック関数が実行スタックに配置され、その中の同期コードが実行されます。この繰り返されるサイクルをイベント ループと呼びます。

ノード

Node.jsの機能

イベント駆動型

コードを上から下まで実行し、コールバックが必要な場合はイベント キューに追加します。メイン スレッドの実行が終了したら、イベント キュー内のコールバックを実行します。プロセス全体では新しいイベントがブロックされることはなく、すでに確立されているイベントを維持する必要もありません。

非ブロッキングIO

メインスレッドがアイドル状態になると、イベント キューのループを開始し、イベント キュー内のイベントを処理します。イベントが IO タスクでない場合は、それ自体で処理されます。IO タスクの場合は、スレッド プールに引き渡されて処理され、コールバック関数が指定されます。その後、ループ キュー内の他のイベントが続行されます。ブロッキング操作が完了すると、結果とコールバック関数がキューに配置され、メインスレッドがループするときにコールバック関数が実行されます。

Node.js の長所と短所

アドバンテージ

  1. 高い同時実行性: Node.js はメイン スレッドを使用してすべてのリクエストを処理し、その後 IO 操作を非同期的に処理することで、スレッドの作成と破棄、およびスレッド間の切り替えによるオーバーヘッドと複雑さを回避します。
  2. IO集約型アプリケーションに最適

欠点:

  1. CPUを集中的に使用するアプリケーションには適していません。長時間の計算によりCPUタイムスライスが解放されず、後続のIOイベントを開始できなくなります。
  2. マルチコアCPUを十分に活用できない
  3. 信頼性が低い。コードの特定の部分がクラッシュすると、システム全体がクラッシュします。

適用可能なシナリオ:

  1. RESTful API: リクエストと応答には少量のテキストのみが必要であり、多くの論理処理は必要ありません。数万の接続を処理でき、APIにリクエストしてデータを整理して返すだけです
  2. Ajaxリクエストが大量にあるシナリオでは
  3. チャットサービス: 軽量、高トラフィック、複雑な計算ロジックなし

Node.js イベントループ

ノード イベント ループは libuv エンジンに依存しています。v8 は js コードを解釈した後、対応するノード API を呼び出します。これらの API は libuv エンジンによって駆動され、対応するタスクを実行し、さまざまなイベントをさまざまなキューに入れて、メイン スレッドの実行を待機します。したがって、ノード イベント ループは libuv エンジンに存在します。

libuvエンジン:イベントループ、ファイル操作などを実装し、非同期を実現するためのnode.jsの中核となる。

node.jsのシングルスレッドは、JavaScriptがシングルスレッドで実行され、内部的にスレッドプールを通じてIO操作が完了することを意味します。

poll (クエリフェーズ) ---》check (チェックフェーズ) ---》close callback (クローズイベントコールバックフェーズ) ---》timer (タイマー検出フェーズ) ---》io コールバックフェーズ ---》アイドルフェーズ ---》ポーリングフェーズ

ポーリングフェーズ(ポーリングフェーズ):

V8 は js コードを解析して libuv エンジンに渡し、ループは最初にポーリング ステージに入ります。まず、ポーリングキューにイベントがあるかどうかを確認し、ある場合は先入先出順にコールバックを実行します。

JavaScript イベントループのケーススタディに関するこの記事はこれで終わりです。JavaScript イベントループの詳細については、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • 最もよく使用されるJavaScriptイベントについて詳しく学ぶ
  • JavaScriptのイベントループの仕組みの分析
  • JavaScript イベント キャプチャ バブリングとキャプチャの詳細
  • jsイベント委譲の詳細な説明
  • js におけるイベントバブリングとイベントキャプチャの簡単な分析
  • Javascript イベントキャプチャとバブリングメソッドの詳細な説明

<<:  Linux の PHP に XML 拡張機能をインストールする詳細な手順

>>:  MySQL で期限切れのデータレコードを定期的に削除する簡単な方法

推薦する

mysql8.0.12 でルートパスワードをリセットする方法

データベースをインストールした後、誤ってインストール ウィンドウを閉じたり、長期間 root ユーザ...

JavaScriptのループの違いについての詳細な説明

目次序文列挙可能なプロパティ反復可能なオブジェクトforEachメソッドとmapメソッドチェーン呼び...

JavaScript/TypeScript で同時リクエスト制御を実装するためのサンプルコード

シナリオリクエストが 10 件あるが、同時リクエストの最大数は 5 件で、リクエスト結果が必要である...

オブジェクトのプロパティを反復処理する際の TypeScript の問題

目次1. 問題2. 解決策1. オブジェクトをanyとして宣言する2. オブジェクトのインターフェー...

Linux の MySQL でリモート接続を承認する方法

注意: 他のマシン (IP) は、承認なしではクライアント経由で MySQL データベースに接続でき...

Centos7 で keepalived ログを別のパスに設定する方法の詳細な説明

Keepalived のインストール: cd <keepalived_sourcecode_p...

HTML+SassはHambergurMenu(ハンバーガーメニュー)を実装します

先日、外国人の方がHTML+CSSを使ってHamburgerMenuを実装している動画を見ました。最...

JS でタブ効果を書く

この記事の例では、タブ効果を記述するためのJSの具体的なコードを参考までに共有しています。具体的な内...

Dockerの高可用性構成の詳細な説明

Docker の作成Docker Compose は、管理対象コンテナをプロジェクト、サービス、コン...

nginxディレクトリパスをリダイレクトする方法

ドメイン名に続くパスがデフォルトの Web ディレクトリではなく、ローカル ディスク上の他のディレク...

WeChatアプレットの世界的な状況の詳細な説明

序文WeChat アプレットでは、App.js の globalData を中間ブリッジとして使用し...

Windows サーバー管理におけるセキュリティの考慮事項

ウェブサーバー1. Webサーバーは、wev、cgi、asp機能を無効にするなど、不要なIISコンポ...

Nginx ドメイン名 SSL 証明書の構成 (Web サイトの http を https にアップグレード)

序文HTTP と HTTPS日常生活でよく使われる URL は、おおまかに次の 2 種類に分けられま...

Vueの子コンポーネントと親コンポーネントの詳細な分析

目次1. 親コンポーネントと子コンポーネント2. テンプレート分離書き込み1. テンプレートタグ2....

WeChat公式アカウントでReactプロジェクトを実行する方法

目次1. a タグを使用して PDF をプレビューまたはダウンロードします。書き方は、携帯電話でクリ...