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

推薦する

WeChatアプレット+EChartsで動的更新プロセス記録を実現

序文最近、小さなプログラムでリアルタイムにチャートを更新するという要件に遭遇しました。最初は wx-...

nginx でネストされた if メソッドを実装する方法

Nginx はネストされた if ステートメントをサポートしておらず、if ステートメントでの論理判...

Linux での mysql および mysql.sock のインストールに関する問題

最近、Linux に Aphace、mysql、php をインストールするときに多くの問題に遭遇しま...

VMware に CentOS7 をインストールし (静的 IP アドレスを設定)、Docker コンテナ経由で mySql データベースをインストールする (非常に詳細なチュートリアル)

2 年生から、これらのインストールと設定の仕方を尋ねられました。簡単なチュートリアルを作成し、ここ...

Node.js における path.join() の利点の分析

文字列連結ではなく path.join() メソッドを使用する必要があるのはなぜか疑問に思うかもしれ...

JS に依存せずにレスポンシブ レイアウトを実現する CSS3 モバイル vw+rem メソッド

1. はじめに(1)vw/vhの紹介使用する前に、vw と rem とは何か、その機能について簡単に...

MySQLのGROUP BYステートメントを最適化する方法

MySQL で、id、a、b の 3 つのフィールドを持つ新しいテーブルを作成します。次のように、同...

vueはel-tableの列幅の適応を完璧に実現します

目次背景技術的ソリューション具体的な実装要約する背景Element UI は、PC で人気の Vue...

MySQL innodb例外の修復に関する経験の共有

テスト用の MySQL ライブラリのセット。以前使用されていたバージョンは、centos6 のデフォ...

MySql におけるプロセス制御関数/統計関数/グループ化クエリの使用法の分析

これからの道のりは長く困難ですが、私は探求を続けます。また週末がやってきました。引き続き、皆さんと一...

ミニプログラムの基本的な使用方法の知識ポイント(非常に包括的で、お勧めです!)

目次アプリを登録するときに何をすればよいですか?ページを登録するときに通常何をする必要がありますか?...

Javascriptの基礎を学ぶための10の重要な質問

目次1. Javascript とは何ですか? 2. DOMとは何か3. JSコードの実行方法4. ...

W3C チュートリアル (6): W3C CSS アクティビティ

スタイル シートは、ドキュメントの表示方法、発音方法、または入力方法を記述します。スタイル シートは...

Quickjs は JavaScript サンドボックスの詳細をカプセル化します

目次1. シナリオ2. 基盤となるAPIを簡素化する2.1 自動的に破棄を呼び出す2.2 VM値を作...

JavaScript で支払いの 10 秒カウントダウンを実現

この記事では、支払いの10秒カウントダウンを実現するためのJavaScriptの具体的なコードを参考...