Node での非同期実装とイベント駆動について話しましょう
Nov 08, 2022 pm 08:14 PMこの記事では、Node での非同期実装とイベント ドライブについて説明します。お役に立てば幸いです。
ノードの特徴
コンピュータの一部のタスクは一般に 2 つのカテゴリに分類でき、1 つのカテゴリは IO と呼ばれます。集中的なものは、コンピューティング集中型と呼ばれます。コンピューティング集中型のタスクの場合、CPU のパフォーマンスは継続的に消耗することしかできませんが、IO 集中型のタスクの場合、理想的にはこれは必要なく、処理のために IO デバイスのみに通知する必要があります。 . 、しばらくしてから戻ってデータを取得してください。 [関連チュートリアルの推奨事項: nodejs ビデオ チュートリアル 、プログラミング ビデオ ]
一部のシナリオでは、完了する必要がある無関係なタスクがいくつかあります。主流 2 つの方法があります:
- マルチスレッドの並列完了: マルチスレッドのコストは、スレッドの作成とスレッド コンテキストの切り替えの実行による高いオーバーヘッドです。さらに、複雑なビジネスでは、マルチスレッド プログラミングは、ロックや状態同期などの問題に直面することがよくあります。
- シングルスレッドの逐次実行: 表現は簡単ですが、逐次実行の欠点はパフォーマンスであり、少し遅いです。その結果、後続のコードは整理されました。
Node が非同期を実装する方法
node
のマルチタスク ソリューションについてお話しましたが、これをnode
の内部に実装するのは簡単ではありません。ここでは、誰もが実行できるように、オペレーティング システムの概念をいくつか紹介します。非同期実装とノードのイベント ループ メカニズムについては後ほど説明します:
ブロッキング IO とノンブロッキング IO
- IO のブロック: アプリケーション レベル IO 呼び出しを開始した後、データを待ち続けます。呼び出しは、オペレーティング システムのカーネル層がすべての操作を完了した後に終了します。
オペレーティング システム内のすべてのものはファイルです。ファイルは、カーネルが IO 操作を実行するときに、ファイル記述子を通じてファイルを管理します
- ノンブロッキング IO: 違いは次のとおりです。ファイル記述子が呼び出しの直後に返され、待機すると、CPU タイム スライスを他のトランザクションの処理に使用できるようになり、このファイル記述子を通じて結果を取得できるようになります。
いくつかの問題ノンブロッキングIOの場合:CPUの使用率は上がりますが、すぐにファイルディスクリプタが返されるため、いつIOが完了するか分かりませんステータスの変化を確認するにはポーリングを行うしかありません操作
さまざまなラウンド クエリ方法
-
read
: 最も原始的でパフォーマンスが最も低い方法で、次の手順で完全なデータの取得を完了します。 ##IO ステータスを繰り返し確認する - select
:
ファイル記述子のイベント ステータス から判断すると、比較的消費量が少なくなりますが、欠点は次のとおりです。ストレージ ステータスに 1024 個の長さの配列を使用するため、最大 1024 個のファイル記述子を同時にチェックできます - poll
:
select## の制限により#,poll
はリンクリストの保存に改良されています 他の方法も基本的に同じですが、ファイル記述子が多い場合、依然としてパフォーマンスが非常に低くなります eopll - : このソリューションは、
linux
にあります。最も効率的な IO イベント通知メカニズムです。ポーリングに入るときに IO イベントがチェックされていない場合、起動するイベントが発生するまでスリープ状態になります。#kqueue
: と - epoll
同様ですが、FreeBSD システムの下でのみ存在します
epoll
#Linux には、シグナルまたはコールバックを通じてデータを送信する AIO メソッドもありますが、これは Linux でのみ利用可能であり、システム キャッシュを使用できない制限があります。
ノードでの非同期 IO の実装
結論からお話しますと、node非同期 IO の実装はマルチスレッドで実装されます。混乱を招く可能性があるのは、
node は内部的にマルチスレッドですが、プログラマが開発した JavaScript
コードは単一のスレッドでのみ実行されることです。 <p><code>node
いくつかのスレッドを使用してブロッキング IO またはノンブロッキング IO とポーリング テクノロジを実行してデータ取得を完了し、1 つのスレッドに計算と処理を実行させ、スレッド間の通信を通じて IO から取得したデータを転送します。非同期IOのシミュレーションを簡単に実現します。
Linux ではすべてがファイルであり、ディスク、ハードウェア、ソケットなどのほぼすべてのコンピューター リソースが含まれるため、非同期 IO に加えて、コンピューター内の他のリソースも適用できます。ファイルが抽象化されているため、次のコンピュータ リソースへの呼び出しの紹介では、IO を例に取り上げます。
イベント ループ
プロセスが開始されると、 node
は while(true)
と同様のループを作成します。ループ本体が実行されると、 Tick
;
以下は、node
のイベント ループ フローチャートです。
#非同期 IO の詳細
#注: プラットフォームが異なると、実装の詳細が異なります。この図では、関連するプラットフォームの互換性の詳細が隠されています。たとえば、Windows の IOCP で
PostQueuedCompletionStatus() を使用して実行ステータスを送信します。 GetQueuedCompletionStatus
eopllを通じてこのプロセスを実装し、スレッド プールを自己実装します。
setIntervallibuv
setTimtout
および
IO などに加えて非同期呼び出しを必要とするコンピューター リソース、
node非同期 IO と関係のないものもいくつかあります
その他の非同期 API:
##setTimeout
#setInterval
setImmediate
process.nextTick
-
このセクションでは、最初に最初の 2 つの API について説明します
-
それらの実装原理は非同期 IO と似ていますが、
IO スレッド プールの参加を必要としないだけです :
setTimtoutand
setInterval作成されたタイマーはタイマー オブザーバー内の赤黒ツリーに挿入されます
毎回- check
- が実行されると、赤黒ツリーから描画されます。タイマー オブジェクトを繰り返し実行し、タイマーが制限時間を超えているかどうかを確認します。
超えた場合は、イベント (リクエスト オブジェクト) をイベント キューを作成し、イベント ループでコールバック関数を実行します
- 赤黒ツリー: ここで簡単に説明すると、自己平衡化が可能な特殊なバランス バイナリ ツリーです。基本的にはバイナリ ツリーの深さです
O(l(
以上がNode での非同期実装とイベント駆動について話しましょうの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

人気の記事

人気の記事

ホットな記事タグ

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











Django はフロントエンドですか、バックエンドですか?それをチェックしてください!

Go 言語のフロントエンド テクノロジーの探求: フロントエンド開発の新しいビジョン
