序文
私のイメージでは、非同期が最初にajaxで登場しました。私はまだその時点で.NETに取り組んでいましたが、.NETは実際に非同期コントロールをリリースしました...
私は最終的にそれが非同期ではないことを知っていましたが...その後、フロントエンドの非同期がよく使用されます。それが非同期プログラムではない場合、あなたが書いたnodejsは機会Javascriptによって作られたと言うのは恥ずかしいです。
非同期プログラミングモデルの機能も引き継がれています。非同期には多くの利点がありますが、それはデザインの悪夢です。非同期はタイミングを破壊する可能性があるため、設計上の困難を増加させます。
ただし、非同期はパフォーマンスの改善とユーザーエクスペリエンスに革命をもたらしたため、NodeJの非同期機能は非常に明白です。今日は簡単に学びます
非同期I/O
実際、オペレーティングシステムレベルでは、ブロックされたブロックと非ブロックの2つのI/Oメソッドのみがあります
閉塞モデルでは、アプリケーションは結果を返す前にI/Oが完了するのを待つ必要があります。その特徴は、バックミッドフィールダーがシステムがすべての操作を完了するのを待つために呼び出されることです。これにより、閉塞コールの直後に戻るのではなく、CPUが待機します。
初心者の頃に本を読んでいましたが、ここでは明確に説明されていないと感じました。さらに、非同期モデルは実際には非常に大きく、感情のレベルの改善にすぎません。簡単な例を挙げましょう
現在、2つの単一ページアプリケーションの単一ページアプリケーションビューがあります。検索するときは、さまざまなチャネルを検索する必要があります。深Shenzhenはサードパーティを呼び出す必要があり、サードパーティは特定のチャネルからデータを取得します。
もちろん、現時点では非常に遅いです。データをロードするためにAからBとBに直接カットした場合、問題はありませんが、問題はAからBに切り替えるときにアニメーション効果が必要であることです。
これには、BViewレンダリングが切り替えプロセス中に終了する必要があり、少なくともデータを取得してレンダリングを開始するためにプロセスに出荷されません。したがって、非同期はそれほど使いやすいものではないかもしれません。データが非同期に要求されている場合でも、ページをロードする前にデータを取得する必要があります。
これはまだブロックされている荷物です、ビジネスでこれを行う方法はありません
テクノロジーは完璧ではなく、詰まりはCPUが無駄になるのを待っています。ノンブロッキングがロジックを破壊し、負荷が完了するかどうかを確認するためにポーリングが必要になる場合があります(ポーリングを使用してDOMが生成されたかどうかを検出しました)
NodeJSは、イベントループメカニズムを採用しています。プロセスが開始されると、ノードはデッドループを作成します。ループ本体を実行する各プロセスはティックです。各ダニのプロセスは、処理する必要があるイベントがあるかどうかを確認することです。
ある場合は、関連するイベントを削除して実行してから、次のロジックを入力します。ない場合は、ループを終了します
各ティックプロセス中に、各イベントループに1人以上のオブザーバーがあります。処理するイベントがあるかどうかを判断するプロセスは、これらのオブザーバーにイベントを処理する必要があるかどうかを尋ねることです。
例として、HTMLイベントモデルを使用してください
HTMLの場合、実際には、それぞれのDOMがオブザーバーです。ページのDOMは、Webページの変更を観察します。 DOMにAddEventListenerを提供した後、コールバック関数を登録します。登録するイベントは、「コンテナ」オブジェクトに配置されます。現時点では、それは単なる登録です。これらの機能は、条件を満たした後(ページが変更されたとき)トリガーされ、関連するイベントは実行のためにコンテナから取り出されます。
次に、ページ上のポイントを1回クリックしてから、コンテナからクリックイベントコレクションを取り出します。関連するDomsを見つけてから、これらのDomsのコールバック関数をトリガーします。
イベントは、ユーザーのクリックやデータの変更から生じる場合があります。ノードでは、イベントは主にネットワークリクエストとファイルI/Oから来ています。これらのイベントには、ファイルオブザーバーやネットワークオブザーバーなど、対応するオブザーバーがいます。
これは、典型的な生産/消費モデル、非同期I/O、イベントの生産を提供するネットワークリクエスト、イベントがさまざまなオブザーバーに渡され、オブザーバーがイベントを登録し、イベントループはイベントを発表してからイベントの実行を担当します
PS:例としてクリックしてください。各DOMオブザーバーは最初にイベントを登録し、ページプロセスは常にページを監視し、ユーザーはページ制作イベントをクリックし、登録されたクリックイベントがコンテナから取り出されて実行されます。
一般的な関数ロジックは、私たちによって制御されます。
コードコピーは次のとおりです。
var foreach = function(list、callback){
for(var i = 0、len = list.length; i <len; i ++){
callback(list [i]、i、list);
}
}
非同期の場合、コールバック関数は開発者によって制御されなくなります。 JSコールが開始されるたびに、遷移製品要求オブジェクトが生成されます。
コードコピーは次のとおりです。
fs.open = function(path、flags、mode、callback){
bingding.open(pathmodule._makelong(path)、stringtoflags(flags)、mode、callback);
};
fs.openは、パスとパラメーターに基づいてファイルを開き、関連するデータを取得します。 C ++関連のインターフェイスは内部的に呼ばれ、プロセス中に中間オブジェクトが生成され、すべての州が含まれます...
PS:長い間見た後は気分が悪い
結論
上記はすべて、nodejsの非同期I/Oに関するものです。個人的な要約、省略やエラーがある場合は、それらを指摘してください。