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 で期限切れのデータレコードを定期的に削除する簡単な方法

推薦する

MySQL での find_in_set() 関数の使用に関する詳細な説明

まず、例を見てみましょう。記事テーブルにはタイプフィールドがあり、1 見出し、2 おすすめ、3 ホッ...

MySQLパスワードを変更するいくつかの方法

序文:データベースを日常的に使用すると、パスワードが単純すぎて変更する必要がある場合、パスワードの有...

Windows での Apache+Tomcat7 負荷分散構成方法の詳細な説明

準備Windows Server 2008 R2 Enterprise (2.40GH、8GB、64...

30分でReact Hooksを包括的に理解できます

目次概要1. 使用状態1.1 3つの概念に関する質問1.2 例1.3 注記2. リデューサーを使用す...

HTML 左、中央、右の適応レイアウト (calc css 式を使用)

最新の HTML 標準には、レイアウトを計算するために使用できる calc CSS 式があります。し...

Centos8 の Django プロジェクトに nginx+uwsgi をデプロイするチュートリアル

1. 仮想環境virtualenvのインストール1. virtualenvをインストールするpip3...

MySQL の重要なログファイルの包括的なインベントリ

目次導入ログ分類パラメータファイルエラーログファイル完全なログファイルスロークエリログバイナリログフ...

JS の compose 関数と pipe 関数の使い方の詳細な説明

目次作成機能配列プロトタイプの削減Array.prototype.reduceRightパイプ関数作...

HTML での非同期ファイルアップロードの例

コードをコピーコードは次のとおりです。 <form action="/hehe&qu...

Vue ページでよりエレガントに画像を紹介する方法

目次エラーのデモンストレーション計算により画像が変わらない場合は直接インポートするCSS変数による画...

シンプルなカレンダー効果を実現する JavaScript コード

この記事では、シンプルなカレンダー効果を実現するためのJavaScriptの具体的なコードを参考まで...

JavaScript の非同期処理で待機時間を節約できますか?

JavaScriptで非同期実行の結果を同期的に取得するには、 for ループ内でawaitを使用...

フロートをクリアするための CSS メソッドの概要

フロートはWebページのレイアウトでよく使用されますが、フローティングブロックレベル要素は標準のドキ...

Chrome 73 によるフレックスレイアウトの崩れの解析と解決方法

現象プロジェクトにはネストされたフレックス構造がいくつかあります。 <スタイル> /* ...

HTML コード例: ハイパーリンクの詳細な説明

ハイパーリンクは、Web サイト上のすべてのページがハイパーリンクで接続され、ページ間を移動できるた...