非同期とは何ですか?非同期と同期は頻繁に議論されるトピックです。同期の概念は非常に単純です。上から下に向かって実行され、上の部分が実行されるまで下の部分は実行されません。非同期処理では、最初にコマンドを送信し、途中で他のトランザクションを実行し、実行が完了したら前のタスクに戻ることができます。 例えば: あなたは美しいガールフレンドに恵まれて幸運です。ある日、ガールフレンドがあなたにテキストメッセージを送ってきて、その夜にどんな映画を観たいか尋ねます。しかし、何を見たらよいかわからないので、すぐにコンピューターを起動して、ガールフレンドが待っていた最新の人気映画をチェックします。これが同期です。 非同期の場合はどうでしょうか?あるいは、ガールフレンドがあなたに何の映画を観たか尋ねるテキストメッセージを送ってきて、あなたは「ちょっと待って、確認するから」と言い、それから彼女に電話してそのことを伝えます。それは非同期です。 このことから、同期と非同期のいくつかの特徴がわかります。 1. 2 つのオブジェクトに発生する必要があります。 (あなたとあなたの彼女) 2. 何かが起こらなければならない。 (映画を見る) 違いは、同期実行は順次実行であり、実行が完了するまで次々に実行されるのに対し、非同期実行は、最初に 1 つを実行し、実行が完了する前に別の 1 つを実行し、最初の実行が完了した後に結果を返すことです。 なぜ非同期性が必要なのでしょうか?答えは明らかです。作業効率を向上させるために、CPUの計算速度とディスクの読み書き速度が離れすぎていて、ディスクが不足しています。そのため、コンピューターのストレージシステムは、効率とコストのバランスをとる階層設計になっています。怠惰こそが人類の進歩の原動力であると言えます。費やす時間を減らして同じ効果を達成できる方法は、間違いなく優先されます。 テキストメッセージを送信する際に相手からの返信を待つ時間は純粋に無駄であり、CPU がディスクに書き込み、結果が返ってくるのを待つ待ち時間も容赦なく消費されます。これは、効率を重視する時代にはまったく耐えられません。そのため、上司は従業員を常に忙しくさせ、その価値を最大化するという目標を追求します。トランザクションを処理する CPU とディスクをフル稼働に保つことも、効率化の要件です。そこで、非同期処理が誕生しました。 非同期IOとは何ですか?非同期 IO とは、オペレーティング システムが提供する IO (データ入出力) 機能を指します。たとえば、キーボード入力は、ディスプレイ上の専用のデータ出力インターフェイスに対応します。これは、私たちが日常的に目にする IO 機能です。このインターフェイスは、オペレーティング システム レベルまで下がります。オペレーティング システムでは、ディスクの読み取りと書き込み、DNS クエリ、データベース接続、ネットワーク要求の処理など、多くの機能が提供されます。 オペレーティング システムのレベルによってパフォーマンスが異なります。非同期かつ非ブロッキングのものもあれば、同期かつブロッキングのものもあります。いずれにしても、これらは上位層と下位層のシステム間のデータ相互作用と見なすことができます。上位層は下位層に依存しますが、その一方で、上位層は下位層が提供する機能を変換することもできます。操作が非同期かつ非ブロッキングの場合、これは非同期かつ非ブロッキングの非同期 IO モデルであり、同期かつブロッキングの場合、これは同期 IO モデルです。 Koa は、すべて js によって実装された上位レベルの Web サービス フレームワークです。オペレーティング システム間のやり取りはすべて nodejs を通じて実装されています。たとえば、nodejs の readFile は非同期の非ブロッキング インターフェイスであり、readFileSync は同期のブロッキング インターフェイスです。 イベントループとは何ですか?イベント ループとは、Node.js によって実行される非ブロッキング I/O 操作を指します。JavaScript はシングル スレッドですが、ほとんどのカーネルはマルチ スレッドであるため、Node.js は可能な限り操作をシステム カーネルに読み込みます。したがって、バックグラウンドで実行される複数の操作を処理できます。これらの操作の 1 つが完了すると、カーネルは Node.js に通知し、Node.js は最終的な実行のために対応するコールバックをポーリング キューに追加できるようになります。つまり、js はシングルスレッドですが、node は実行時に実際にはマルチスレッドになります。 (個人的な理解) メッセージ キューは、さまざまなメッセージを格納する先入れ先出しキューです。 V8エンジンよく話題になる Chrome エンジンや nodejs エンジンは V8 エンジンであり、おおよそ次の要素で構成されています。 このエンジンは、メモリ ヒープとコール スタックで構成されています。メモリ ヒープは、変数の割り当てなどのメモリ割り当てを担当し、コール スタックはコードが実行される場所です。 メインスレッドのコードは、コールスタック内で順番に実行されます。コールスタックが空になると、js エンジンはメッセージキューに移動してメッセージを取得します。入手したら実行してください。 JavaScript はシングルスレッド プログラミング言語であり、単一の呼び出しスタックを持ちます。したがって、一度に実行できるのは 1 つのことだけです。コール スタックは、基本的にプログラム内のどこにいるかを追跡するデータ構造です。関数にステップインすると、このデータがスタックの一番上に配置されます。関数から戻ると、これらのデータはスタックの上からポップされます。スタックはそのためにあるのです。コールスタック内の各エントリはスタック フレームと呼ばれます。ヒープとスタックの違いは、一方が先入れ先出しであり、もう一方が後入れ先出しである点です。 jsが実行されるとタイマー setTimeout など、よく使用する一部の API は、js エンジンでは提供されません。 これらは実際にはブラウザ内、つまり実行時に提供されるため、JavaScript エンジン以外にも実際には他のコンポーネントが存在します。 コンポーネントの 1 つは、DOM、AJAX、setTimeout などの Web API と呼ばれ、ブラウザーによって提供されます。 さらに、非常に人気のあるイベント ループとコールバック キューもあります。 ランタイムは、エンジン スレッドにメッセージを送信する役割を担います。ランタイムの役割はメッセージの生成のみであり、メッセージの取得は行いません。 メッセージキューメインスレッドは実行中に非同期タスクに遭遇すると、関数を起動するか関数を登録し、イベントループスレッドを通じて対応するワーカースレッド(ajax、dom、setTimoutなど)に通知します。同時に、メインスレッドは待機せずに逆方向に実行を続けます。ワーカースレッドがタスクを完了すると、イベントループスレッドがメッセージをメッセージキューに追加します。このときメインスレッドのコールスタックが空であれば、メッセージキューの先頭にあるメッセージが順に実行されます。 新しいメッセージがキューに入ると、自動的にキューの最後に配置されます。 シングルスレッドとは、js タスクをキューに入れる必要があることを意味します。前のタスクに時間のかかる操作が多数ある場合、後続のタスクを実行できず、タスクが蓄積されるとページが「疑似死」状態になります。これは、js プログラミングでは常に回避することを強調してきた「落とし穴」でもあります。 メインスレッドは上記の手順をループします。イベントループは、メインスレッドがメッセージキューからメッセージを繰り返し取得して実行するプロセスです。 GUI レンダリング スレッドと JS エンジンは相互に排他的であることに注意してください。JS エンジンの実行中は GUI スレッドが一時停止され、GUI の更新はキューに保存され、JS エンジンがアイドル状態のときにすぐに実行されます。したがって、js エンジンのメイン スレッド コール スタックが空のときにページ レンダリングが実行されます。 実際、イベント ループ メカニズムとメッセージ キューのメンテナンスは、イベント トリガー スレッドによって制御されます。 イベントをトリガーするスレッドも、メッセージ キューを維持するブラウザー レンダリング エンジンによって提供されます。 JS エンジン スレッドが非同期 (DOM イベント監視、ネットワーク リクエスト、setTimeout タイマーなど) に遭遇すると、対応するスレッドに引き継がれて非同期タスクのみを維持し、一定時間待機します (タイマー終了、ネットワーク リクエスト成功、ユーザーによる DOM クリック)。その後、イベントによってスレッドがトリガーされ、非同期に対応するコールバック関数がメッセージ キューに追加され、メッセージ キュー内のコールバック関数は実行を待機します。 同時に、JS エンジン スレッドは実行スタックを維持し、同期コードは実行スタックに順番に追加されて実行され、終了すると実行スタックから終了します。 実行スタック内のタスクが完了した場合、つまり実行スタックが空の場合 (つまり、JS エンジン スレッドがアイドル状態の場合)、イベント トリガー スレッドはメッセージ キューからタスク (つまり、非同期コールバック関数) を取り出し、実行スタックに入れて実行します。 上記はノードイベントループとメッセージキューの詳細な分析です。ノードイベントループとメッセージキューの詳細については、123WORDPRESS.COMの他の関連記事に注目してください。 以下もご興味があるかもしれません:
|
<<: VSCode+CMake+Clang+GCC 環境構築チュートリアル (Win10 の場合)
>>: MySQL 半同期レプリケーションの原理構成と導入の詳細な説明
「mysqlは内部コマンドではありません」というエラーは、mysqlのbinディレクトリパスが環境変...
目次最近Reactを勉強していて、今は仕事でVueを使っています。学習の過程で、両者を比較して理解を...
場合によっては、SQL へのデータのエクスポートとインポートを容易にするために、特定のツールを使用し...
最近、webpackの使い方を学んでいたときに、webpack-replace-loaderの設定正...
セルのパディングは、セルの内容と境界線の間の距離です。基本的な構文<TABLE セルパディング...
目次必要とする実装コードデータベース数日前、友人からこれを書くのを手伝ってほしいと頼まれました。ただ...
1. 関連する技術的なポイントバイト版ヴュー3 ts統合ルーティングvuexを統合するAxiosを統...
シナリオシミュレーション:ある会社の運用保守担当者は、以前購入した一連のネットワーク機器の光ポートの...
目次これ方法オブジェクト内これを隠した厳密モードこれを変更してこれいつものように、まずはコードを見て...
関連する依存関係をインストールするnpm i lib-flexible --save npm i p...
仮想化とコンテナ化は、クラウドベースのプロジェクトでは避けられない 2 つの問題です。仮想化は純粋な...
<area> タグは、イメージ マップ内の領域を定義します (注: イメージ マップはク...
MYSQL でよく使用されるクエリ コマンド: mysql> select version()...
この記事では、参考までに、簡単なタイマー機能を実装するためのvue.jsの具体的なコードを紹介します...
この記事では、キャンバスを使用してWeChatアプレットに時計を描く具体的なコードを参考までに共有し...